如何在 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

每次调用时,他们还将提供之前提供的身份验证令牌。

我的问题是:

  1. 在 URL 中提供 userId 是多余的吗?当我们每次调用都获得一个令牌时,我们可以找出哪个用户正在执行调用以及 return 他们的图书列表。 userId 不是严格要求的。

  2. 删除 userId 是否会破坏 REST 原则,因为 /users/books/ 看起来应该 return 所有用户的所有书籍?

  3. 我是不是应该咬紧牙关,根据令牌对它们进行身份验证,然后检查令牌是否属于同一个 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.