RESTful API 子资源模式

RESTful API subresource pattern

在设计 RESTful API 时,以下调用为我们提供了用户 123 的基本信息(名字、姓氏等):

/api/users/123

我们有很多关于用户的信息,因此我们进行额外的调用以获取用户的子资源,例如他们的购物车:

/api/users/123/cart

对于管理页面,我们希望看到所有用户的所有购物车信息。一个很大的 table 列出每个用户和他们的购物车的一些详细信息。显然,我们不想为每个用户(大量请求)单独调用 API。如何使用 RESTful API 模式来完成?

/api/carts/users 浮现在脑海,但理论上你有两种方法可以通过 /api/carts/users/123.

获得特定用户的购物车

这通常可以通过向 REST 服务器添加取消引用功能来解决。假设您的用户的响应如下:

{
  ...
  cartId: "12345",
  ...
}

您可以通过传入查询字符串“&deref=cart”(或者您设置语法)来添加简单的取消引用。

这仍然存在为每个用户发出请求的问题。我认为通常有两种方法可以做到这一点。第一个是 multiget 类型的资源(参见 [1] 的例子)。这种方法的问题是您必须知道所有 ID 并自己处理分页。第二个(我认为更好)是为您的用户资源实现一个索引端点。索引允许您查询资源(通常通过查询字符串,如 firstName=X 或您想要排序的任何其他内容。)然后您应该实现基本分页,这样您就不会传递大量数据。有大量的分页示例,但最简单的是指定一个数字 (count=20)、一个起始标记 (since=X) 和一个排序顺序 (sort=-createdAt)。

这些实现允许您通过迭代索引端点来请求所有用户及其购物车。作为分页 [2].

的起点,您可能会发现这很有帮助

[1] - How to construct a REST API that takes an array of id's for the resources

[2] - Pagination in a REST web application

出于某种原因,我假设同一资源有 2 个 URI 是一件坏事。在我的情况下 /api/users/123/cart 和 /api/carts/users/123 会 return 相同的数据。通过更多的研究,我从无数来源了解到,对同一资源使用多个 URI 是可以接受的 如果它对最终用户有意义

在我的例子中,我可能不会公开 /api/carts/users/123,但我计划使用 /api/carts/users 和一些查询参数来 return 系统中的购物车子集。同样,我将 /api/carts/orgs 用于搜索组织购物车。

我发现一个非常好的网站,有示例和清晰的解释是 REST API Tutorial。我希望这可以帮助其他人规划他们的 API URI。