【问题标题】:How should my URIs be structured to be considered RESTful?我的 URI 应该如何构造才能被视为 RESTful?
【发布时间】:2012-11-30 14:54:02
【问题描述】:

我开始为我的项目开发一个公共 API,我想使它成为 RESTful。
我一直在看到一些关于某些 API(如 twitter 的)不是真正 RESTful 的文章,我想尝试让我的 API 尽可能地 RESTful(似乎没那么简单:))

目前我正在考虑一件事,假设有两个资源,用户和电影,每个用户都有一个电影列表,我想创建一个 REST api 来获取当前连接用户的所有电影,设计这个的正确方法是什么?
(XXX 是某种身份验证令牌 - 我还没有决定要实现什么身份验证)

  1. GET /movies?token=XXX
  2. GET /users/XXX/movies

或者可能是其他东西?

此外,如果有人可以指导我阅读有关该主题的好书,这将有助于我创建尽可能 RESTful 的公共 API,那将是一个很大的帮助!

【问题讨论】:

  • 问“什么是做 X 的正确方法”是在要求一个主观的答案,很可能导致这个问题被关闭。您能否将您的问题重新表述为具有明确事实答案的问题?
  • 嗨Tragedian,我认为由于REST具有特定的结构和规则,因此只有一个(正确的)答案,我弄错了吗?我应该改写标题还是整个问题写得不好?你能给我一个例子吗,因为我真的不知道我可以改变这个:/
  • 是的,rest 不是一个真正的路径,它是一组约束,你的 URL 看起来不是其中之一(只要它代表一个名词而不是某种动作/动词)
  • @Nicholas 你的评论正是我想要的:) 看来我的方法是错误的。谢谢!
  • @Tragedian 我编辑了标题,希望这会更好...

标签: api rest


【解决方案1】:

我真的很喜欢 Leonard Richardson 的 Restful Web Services。他解释了 REST,一些网站如何滥用它,如何正确使用它,何时使用查询字符串与将信息放在 URI 路径中。他还介绍了身份验证,但他对这个主题有点简短。他花了很多时间解释为什么 REST 比 SOAP 更好——我喜欢它,但其他评论者似乎觉得它过分了。他在他的大部分示例中都使用了 Ruby/Rails。

在您的两个示例中,我更喜欢“GET /users/XXX/movies”而不是第一个。使用查询字符串有利于搜索或可选参数。像 google.com/?q=batman 或 /users/XXX/movies?page=2 这样的东西。由于您正在查看特定用户的电影,因此 URI 与该结构相匹配是有意义的,而选项 2 就是这样做的。

有些网站并不是真正的 RESTful,因为它们提供了像

这样的方法
GET /GetUser?token=XXX
GET /SaveUser?token=XXX&name=YYY

真正的 RESTful 服务将遵循现有的 HTTP 命令并操作资源,而不是函数。根据书中的说法,如果你遵循 HTTP 协议,你的服务名称中通常不需要“get”或“save”之类的词——它们是由 HTTP 提供的。

GET /user/XXX
PUT /user

希望这会有所帮助。我没有任何好的网络资源,但我建议你试试那本书。

【讨论】:

  • 我完全同意这个答案。尤其是 我更喜欢“GET /users/XXX/movies”这一行而不是第一行。使用查询字符串有利于搜索或可选参数
  • 谢谢迈克尔,我会试试这本书。另外,是否可以将身份验证令牌作为标头传递,还是应该在 URI 中传递?
  • 如果可以,请尝试使用 HTTP 现有的身份验证方案之一:带有 Basic 或(更好的)Digest 令牌的 Authorization 标头,但如果您不能,您可以将其作为标头从客户端(某种脚本要求。)然后一定要这样做。保持 URI 干净。只要确保在人们未经过身份验证时返回 401,这样缓存就不会保存失败响应
  • 但是如果我要使用标头或内置身份验证,那么 URI 将如下所示:GET /users/movies,并且当前用户将从 auth 标头中获取,我看到了投诉关于这种类型的 URI,它不是 RESTful,因为相同的 URI 会为不同的人返回不同的结果(请参阅此处stackoverflow.com/questions/3408191/…) - 我误解了?
  • 您可以通过将 URI 保留为 /users/keisar/movies 来处理此问题。如果只允许 keisar 观看他的电影,那么 URI 保持不变,但您添加了身份验证——因此 /user/keisar/movies 将起作用,但 /users/michael/movies 将被拒绝。如果用户可以观看任何其他用户的电影,则 URI 仍然相同,但不需要身份验证。您没有使用身份验证来确定要返回的数据;您正在使用它来确定用户是否可以查看请求的资源。
【解决方案2】:

阅读 Roy Thomas Fielding 的博士论文,题为@9​​87654321@,证明是我了解 REST 架构风格的好方法。起初看起来令人生畏,但其中充满了可以帮助您设计更好的 API 的见解。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多