RESTful API子资源模式

时间:2015-07-17 21:03:43

标签: rest restful-url restful-architecture

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

/api/users/123

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

/api/users/123/cart

对于管理页面,我们希望查看所有用户的所有购物车信息。列出每个用户的大表以及有关其购物车的一些详细信息。显然,我们不想为每个用户(大量请求)进行单独的API调用。如何使用RESTful API模式完成这项工作?

想到了

/ api / carts / users,但理论上你有两种方法可以通过/ api / carts / users / 123获得特定用户的购物车。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

在我的情况下,我可能不会暴露/ api / carts / users / 123,但是我计划使用带有一些查询参数的/ api / carts / users来返回系统中的推车子集。同样,我将有/ api / carts / orgs来搜索org购物车。

一个非常好的网站,我通过示例和明确的解释找到了REST API Tutorial。我希望这可以帮助其他人规划他们的API URI。