【发布时间】:2015-05-14 08:15:10
【问题描述】:
重要提示
这个问题的重点是区分根据谁进行身份验证返回哪些资源的 API 端点,例如Alice 得到资源 A 和 B 返回,Bob 得到资源 X 和 Y。
不是要区分返回的资源的表示。
所有端点都返回资源的 JSON 表示形式。
前言
请考虑以下三种潜在的 API 端点设计,它们都返回用户的 thing 资源。
端点 A
GET /things
如果在请求中提供了<user_x> 的身份验证凭据,它会返回与<user_x> 专门相关的thing 资源。
例如,认证用户 Alice 得到资源 A 和 B,认证用户 Bob 得到资源 X 和 Y。
因此,不同身份验证用户的响应差异在于返回哪些资源实例,而不返回这些实例的哪些信息(即资源表示)。
身份验证失败时返回 401 响应。
端点 B
GET /user/<user_x>/things
端点 C
GET /things/?user_id=<user_x>
端点 B 和 C 都提供与 <user_x> 相关的 thing 资源实例,iff 身份验证用户有权访问这些 thing 资源。
返回的thing 资源实例的表示形式,例如返回的有关资源的哪些信息可能因用户身份验证而异。例如,<user_x> 或管理员用户可能会在每个资源实例中获得比访问权限有限的用户更丰富的数据。
验证对<user_x> 的thing 资源没有任何访问权限的用户将得到 401 响应。
我的问题
我想回答以下问题:
1) 端点是 RESTful 的吗?
2) 端点 A 是否有良好的 URI 设计?
3) 端点 B 和 C 是 RESTful 的吗?
4) 端点 B 和 C 是否具有良好的 URI 设计?
期待您的回答。我还在下面提供了my own answers,也将不胜感激。
谢谢!
——弗莱迪·斯奈德
【问题讨论】:
-
您的问题向我表明您不了解 RESTful 意味着什么。 REST 是一种主要基于原则和模式的整体架构风格(即方法)。因此,询问特定端点是否为 RESTful 是没有意义的。
-
另外,不管你信不信,你设计和组织 URI 的方式与 REST 无关。 REST 的“大问题”是要求在响应中传递链接,从而为客户端提供进一步导航资源的可能性。虽然对 URI 进行有意设计可能是有益的,但它们应该被客户端视为完全不透明。反过来,客户端应该只根据收到的关系导航链接,而不是一些关于如何构建 URI 的先入为主的概念。
-
Jonathan W,很抱歉,但我认为您的评估不公平。我确实了解 REST。当我描述端点时,我还描述了它们的行为方式(服务如何处理对这些端点的请求以及它如何响应)。因此,当我询问端点 X 是否为 RESTful 时,我会询问所描述的行为是否符合 REST 原则和模式。幂等性和安全性等行为也是与 REST 相关的重要概念;我将自己的答案集中在这些概念上。确实,我没有提到任何有关在响应中传递的链接。
-
Jonathan W,关于您对 URI 的评论:这就是为什么我有两种类型的问题:一种与端点行为的 RESTful 相关,另一种与 URI 设计有关,这确实是一个单独的主题。
-
Jonathan W,我的问题的重点实际上是关于根据谁进行身份验证做出响应(这里我的意思是返回哪些资源集)的优点。这可以通过端点 A 举例说明。虽然,如果您考虑一下,纯粹从 REST 的角度来看,这似乎并不重要。但实际上,我认为最好只使用 B 和 C 等端点,因为它们通过 URI 明确说明了 API 用户的需求。我希望得到有关这方面的反馈。尽管您和其他人制作的 cmets 对于任何对 REST 感兴趣的人来说都非常有价值。
标签: rest authentication uri restful-url api-design