就 RESTful 和无状态而言,拥有 REST 资源(例如 /currentUser)是否合法?
Is it legal to have REST resource such as /currentUser in terms of RESTful and stateless?
就 RESTful 和无状态而言,拥有像
这样的资源是非常合法的
/users/123
但是,问题是:拥有省略用户 ID 并假定它是从用户会话在服务器上隐式解析的资源是否合法?例如:
/loggedUser
当标识符为 123 的用户获得授权时,该资源将指向 /users/123。
是的。
ReST 服务对授权上下文做出假设是很常见的。
尽管做出这样的决定将限制该路由对登录用户以外的用户的可用性。例如,管理员可能需要为特定用户使用该服务。
ReST 端点甚至可以使用授权上下文中存在的声明。例如 return 使用某种机制登录的用户的不同数据。
在所有 HTTP headers 中,有些可能不适用于定制 ReST 响应。例如我不会使用 'referer'.
确保在做出此类设计决策之前检查您可能拥有的任何缓存策略。
只要您使用仅请求中的数据就可以了(在您的情况下是HTTP Headers)。换句话说,这可能仅适用于通过身份验证的用户。
只要保持无状态,它就是完全合法的。也就是说,您可以从随 HTTP 请求提供的安全上下文中推断出当前用户,通常是某种令牌。
例如,您使用包含 JWT 令牌的 Authentication
header 执行 GET /current-user
。服务器可以从 JWT 令牌中获取当前用户的大部分用户信息,并从数据库中完成数据并将其检索回调用方。
我还建议不要在 URI 中使用驼峰式大小写。这对开发人员来说可能是一场噩梦,而且某些服务器不区分大小写。
请注意,如果您持有服务器用户 session,正如您在问题中暗示的那样,您的 API 已经是有状态的。
正如@n00b 所说,REST 不是正式标准——这可能是件好事。
原文定义来自Roy Fielding's dissertation. - so if you're doing the things Roy recommends, your design is RESTful. There are a few other things people have added to that - for instance, the Richardson Maturity Model is pretty commonly accepted. There are a few public "standards" documents on the web, e.g. Microsoft's version。不过,我不认为他们直接解决了这个问题。
所以,这取决于你 - 但它的价值...
我相信 APIs 应该是一致的和可预测的。如果我要询问有关用户的信息,我真的不喜欢有两种方法 - 一种是通过 ID,一种是使用当前用户的魔术标识符。我也不喜欢将状态概念引入 API 的想法 - 通过说 "there's an conceptual entity in your API called current user",即使您使用 HTTP headers 来管理,您也是在引入状态概念那。
因此,如果您的 RESTful API 是为客户端应用程序使用而设计的,我认为要求该客户端管理状态并携带当前用户的 ID 是合理的。这也使您的 GET 请求始终可缓存 - 理论上您可以缓存 /users/123
,但不能缓存 /loggedUser
.
我认为您的身份验证和授权操作(我已经登录,证明我是谁,因此可以访问系统上的特定资源)与 "I am user 123" 在逻辑上存在差异。
您可能不同意这一点的原因是它使您的 API 更难被人类发现 - 试图弄清楚如何获取有关当前用户的信息的人必须登录,并且然后记住他们的用户 ID。
选择资源定位器
使用 /me
、/users/me
、/users/myself
、/users/current
或类似的 URI 来标识对应于 已验证用户的资源 从 REST 的角度来看非常好。根据 Roy Thomas Fielding 的论文,任何可以命名的信息都可以是资源:
5.2.1.1 Resources and Resource Identifiers
The key abstraction of information in REST is a resource. Any information that can be named can be a resource: a document or image, a temporal service (e.g. "today's weather in Los Angeles"), a collection of other resources, a non-virtual object (e.g. a person), and so on. In other words, any concept that might be the target of an author's hypertext reference must fit within the definition of a resource. A resource is a conceptual mapping to a set of entities, not the entity that corresponds to the mapping at any particular point in time. [...]
使用上面提到的 URI 时,您有一个 已验证用户 的标识符,它将始终标识 概念 authenticated user,不管哪个用户被认证。
无状态约束
stateless 约束与资源的识别方式无关。无状态约束是关于不在服务器端存储任何会话状态。在这种方法中,从客户端到服务器的每个请求都必须包含服务器可以理解的所有必要信息。
请参阅以下引自菲尔丁论文的问题:
[...] each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client. [...]
例如,当以需要身份验证的受保护资源为目标时,每个请求都必须包含所有必要的数据才能正确authenticated/authorized。
已回答类似问题 and 。
就 RESTful 和无状态而言,拥有像
这样的资源是非常合法的/users/123
但是,问题是:拥有省略用户 ID 并假定它是从用户会话在服务器上隐式解析的资源是否合法?例如:
/loggedUser
当标识符为 123 的用户获得授权时,该资源将指向 /users/123。
是的。 ReST 服务对授权上下文做出假设是很常见的。 尽管做出这样的决定将限制该路由对登录用户以外的用户的可用性。例如,管理员可能需要为特定用户使用该服务。
ReST 端点甚至可以使用授权上下文中存在的声明。例如 return 使用某种机制登录的用户的不同数据。
在所有 HTTP headers 中,有些可能不适用于定制 ReST 响应。例如我不会使用 'referer'.
确保在做出此类设计决策之前检查您可能拥有的任何缓存策略。
只要您使用仅请求中的数据就可以了(在您的情况下是HTTP Headers)。换句话说,这可能仅适用于通过身份验证的用户。
只要保持无状态,它就是完全合法的。也就是说,您可以从随 HTTP 请求提供的安全上下文中推断出当前用户,通常是某种令牌。
例如,您使用包含 JWT 令牌的 Authentication
header 执行 GET /current-user
。服务器可以从 JWT 令牌中获取当前用户的大部分用户信息,并从数据库中完成数据并将其检索回调用方。
我还建议不要在 URI 中使用驼峰式大小写。这对开发人员来说可能是一场噩梦,而且某些服务器不区分大小写。
请注意,如果您持有服务器用户 session,正如您在问题中暗示的那样,您的 API 已经是有状态的。
正如@n00b 所说,REST 不是正式标准——这可能是件好事。
原文定义来自Roy Fielding's dissertation. - so if you're doing the things Roy recommends, your design is RESTful. There are a few other things people have added to that - for instance, the Richardson Maturity Model is pretty commonly accepted. There are a few public "standards" documents on the web, e.g. Microsoft's version。不过,我不认为他们直接解决了这个问题。
所以,这取决于你 - 但它的价值...
我相信 APIs 应该是一致的和可预测的。如果我要询问有关用户的信息,我真的不喜欢有两种方法 - 一种是通过 ID,一种是使用当前用户的魔术标识符。我也不喜欢将状态概念引入 API 的想法 - 通过说 "there's an conceptual entity in your API called current user",即使您使用 HTTP headers 来管理,您也是在引入状态概念那。
因此,如果您的 RESTful API 是为客户端应用程序使用而设计的,我认为要求该客户端管理状态并携带当前用户的 ID 是合理的。这也使您的 GET 请求始终可缓存 - 理论上您可以缓存 /users/123
,但不能缓存 /loggedUser
.
我认为您的身份验证和授权操作(我已经登录,证明我是谁,因此可以访问系统上的特定资源)与 "I am user 123" 在逻辑上存在差异。
您可能不同意这一点的原因是它使您的 API 更难被人类发现 - 试图弄清楚如何获取有关当前用户的信息的人必须登录,并且然后记住他们的用户 ID。
选择资源定位器
使用 /me
、/users/me
、/users/myself
、/users/current
或类似的 URI 来标识对应于 已验证用户的资源 从 REST 的角度来看非常好。根据 Roy Thomas Fielding 的论文,任何可以命名的信息都可以是资源:
5.2.1.1 Resources and Resource Identifiers
The key abstraction of information in REST is a resource. Any information that can be named can be a resource: a document or image, a temporal service (e.g. "today's weather in Los Angeles"), a collection of other resources, a non-virtual object (e.g. a person), and so on. In other words, any concept that might be the target of an author's hypertext reference must fit within the definition of a resource. A resource is a conceptual mapping to a set of entities, not the entity that corresponds to the mapping at any particular point in time. [...]
使用上面提到的 URI 时,您有一个 已验证用户 的标识符,它将始终标识 概念 authenticated user,不管哪个用户被认证。
无状态约束
stateless 约束与资源的识别方式无关。无状态约束是关于不在服务器端存储任何会话状态。在这种方法中,从客户端到服务器的每个请求都必须包含服务器可以理解的所有必要信息。
请参阅以下引自菲尔丁论文的问题:
[...] each request from client to server must contain all of the information necessary to understand the request, and cannot take advantage of any stored context on the server. Session state is therefore kept entirely on the client. [...]
例如,当以需要身份验证的受保护资源为目标时,每个请求都必须包含所有必要的数据才能正确authenticated/authorized。
已回答类似问题