REST API 获取单个最新资源

dav*_*son 2 rest

我正在设计一个 REST api,如果有人可以在以下场景中帮助最佳实践,我很感兴趣。

我有...

  • GET Customers/{customerId}/Orders - 获取所有客户订单
  • GET Customers/{customerId}/Orders/{orderId} - 获取特定订单

我需要提供获取客户最近订单的能力。这种情况下的最佳实践是什么?简单地获取所有并按日期排序或提供特定方法?

Tra*_*axo 7

我认为没有必要走另一条路。

&order=-created_at&limit=1在您的获取请求中传递类似的内容

或者 &order=created_at&orderby=DESC&limit=1(注意我不确定命名你的参数,所以也许你可以使用&count=1而不是&limit=1,同上顺序参数)

我认为这还取决于您是否在该路线上使用分页,因此可能需要额外的参数

Customers/{customerId}/Orders?order=-created_at&limit=1
Run Code Online (Sandbox Code Playgroud)


cas*_*lin 5

我需要提供获取客户最近订单的能力。

当然,您可以提供查询参数来过滤、排序和切片订单集合,但为什么不让它更简单并在客户需要时提供最新订单呢?

您可以使用类似的东西(返回单个订单的表示):

GET /customers/{customerId}/orders/latest
Run Code Online (Sandbox Code Playgroud)

上面的 URL 将映射一个会随时间变化的订单,这完全没问题。


假设还有一种情况,您需要最后 5 个订单。你的路线会是什么样子?

上述方法侧重于获取客户最新订单要求的能力。如果返回最后 5 个订单的要求最终在一段时间后出现,我可能会引入另一个映射,例如/recent返回包含最近订单的集合的表示并接受一个查询参数,该参数指示要返回的订单数量(5将是如果省略参数,则为默认值)。

/latest映射仍然是有效的,将只返回了最新的顺序的表示。

提供查询参数来过滤、排序和切片订单集合仍然是一种有效的方法。

关键是:如果您知道将使用 API 的客户,请将其定位到他们的需求。否则,让它更通用。并且在修改 API 时,请注意破坏性更改,也欢迎对 API 进行版本控制。

  • “如果客户只需要最新的订单,我为什么不为此引入一个新的端点”:因为它在哪里结束?下周,客户将需要另一个特定于案例的端点,下个月还需要另一个。越来越多的代码和独特的 URL 将会出现。对于您的代码和调用者来说,使用查询参数进行过滤要容易得多。当你想组合其中一些过滤器选项时,特定的 url 大小写会爆炸,而过滤器参数大小写则没问题。 (2认同)