如何在 REST API 中设计来自当前用户的 URL 到 return 的数据?
How to design URL to return data from the current user in a REST API?
我有一个基于 REST 的服务,用户可以在其中 return 自己的图书列表(这是一个私人列表)。
URL 目前是 ../api/users/{userId}/books
每次调用时,他们还将提供之前提供的身份验证令牌。
我的问题是:
在 URL 中提供 userId
是多余的吗?当我们每次调用都获得一个令牌时,我们可以找出哪个用户正在执行调用以及 return 他们的图书列表。 userId
不是严格要求的。
删除 userId
是否会破坏 REST 原则,因为 /users/books/
看起来应该 return 所有用户的所有书籍?
我是不是应该咬紧牙关,根据令牌对它们进行身份验证,然后检查令牌是否属于同一个 userId
?
我不认为删除 userId 会破坏任何 REST 原则,因为毕竟 /users 和他们 /books,它的解释有点开放,REST 基本上什么也没说,另一方面,如果你是要保留请求中的 id,您必须检查用户 id 是否与连接的用户相同,无论如何,对我来说 1 是多余的,因为您已经拥有该信息,另外,每次您都将无用检查,因为无论如何,经过身份验证的用户 ID 是您在所有情况下都将信任的用户 ID。
此致
REST 是面向资源的,所以在您看来资源用户或书籍是什么。我的观点是书。我想你可以请求这些资源
/api/books?user={userid}
但是这个 URL 无法解决您的权限问题,因此您必须在您的代码中使用您可以通过 OAuth2 协议或其他协议获得的令牌信息来执行此操作。
简答
您可以在 URL 中使用 me
来引用 当前用户 。使用这种方法,您将得到如下 URL:/users/me/books
.
每个问题的答案
Is supplying the userId
in the URL redundant? As we get a token with each call we can find out which user is performing the call and return their list of books. The userId
is not strictly required.
您可以考虑这样做:/users/me/books
。其中 me
指的是 当前用户 。比/users/books
更易懂,可用于return用户的所有书籍
为了获得一些灵活性,除了 /users/me/books
,您还可以支持 /users/{userId}/books
。
URL /users/me
可用于 return 来自当前用户的数据。许多 API,例如 StackExchange, Facebook, Spotify and Google+ 都采用这种方法。
Would removing the userId
break REST principles as /users/books/
looks like it should return all books for all users?
我不认为它会破坏任何 REST 原则,但我认为您的资源不会被正确识别。正如我在上面回答的那样,我会使用 /users/me/books
并且还支持 /users/{userId}/books
.
Should I just bite the bullet and authenticate them against the token and then check that the token belongs to the same userId
?
当使用 URL 中的 userId
向用户请求私人信息时,检查令牌是否属于包含在 userId
中的用户没有什么坏处URL.
我有一个基于 REST 的服务,用户可以在其中 return 自己的图书列表(这是一个私人列表)。
URL 目前是 ../api/users/{userId}/books
每次调用时,他们还将提供之前提供的身份验证令牌。
我的问题是:
在 URL 中提供
userId
是多余的吗?当我们每次调用都获得一个令牌时,我们可以找出哪个用户正在执行调用以及 return 他们的图书列表。userId
不是严格要求的。删除
userId
是否会破坏 REST 原则,因为/users/books/
看起来应该 return 所有用户的所有书籍?我是不是应该咬紧牙关,根据令牌对它们进行身份验证,然后检查令牌是否属于同一个
userId
?
我不认为删除 userId 会破坏任何 REST 原则,因为毕竟 /users 和他们 /books,它的解释有点开放,REST 基本上什么也没说,另一方面,如果你是要保留请求中的 id,您必须检查用户 id 是否与连接的用户相同,无论如何,对我来说 1 是多余的,因为您已经拥有该信息,另外,每次您都将无用检查,因为无论如何,经过身份验证的用户 ID 是您在所有情况下都将信任的用户 ID。
此致
REST 是面向资源的,所以在您看来资源用户或书籍是什么。我的观点是书。我想你可以请求这些资源 /api/books?user={userid} 但是这个 URL 无法解决您的权限问题,因此您必须在您的代码中使用您可以通过 OAuth2 协议或其他协议获得的令牌信息来执行此操作。
简答
您可以在 URL 中使用 me
来引用 当前用户 。使用这种方法,您将得到如下 URL:/users/me/books
.
每个问题的答案
Is supplying the
userId
in the URL redundant? As we get a token with each call we can find out which user is performing the call and return their list of books. TheuserId
is not strictly required.
您可以考虑这样做:/users/me/books
。其中 me
指的是 当前用户 。比/users/books
更易懂,可用于return用户的所有书籍
为了获得一些灵活性,除了 /users/me/books
,您还可以支持 /users/{userId}/books
。
URL /users/me
可用于 return 来自当前用户的数据。许多 API,例如 StackExchange, Facebook, Spotify and Google+ 都采用这种方法。
Would removing the
userId
break REST principles as/users/books/
looks like it should return all books for all users?
我不认为它会破坏任何 REST 原则,但我认为您的资源不会被正确识别。正如我在上面回答的那样,我会使用 /users/me/books
并且还支持 /users/{userId}/books
.
Should I just bite the bullet and authenticate them against the token and then check that the token belongs to the same
userId
?
当使用 URL 中的 userId
向用户请求私人信息时,检查令牌是否属于包含在 userId
中的用户没有什么坏处URL.