使用 REST 获取多个资源(批量获取)的正确方法是什么?

What is the correct way to do a get for multiple resources (batch get) with REST?

是吗:

GET api/stuff?ids[]=123&ids[]=456&ids[]=789&ids[]=101112&etc...

是吗:

POST api/stuff/batch
  body: ids: [123, 456, 789, 101112, etc]

?

第一个在语义上似乎是正确的,但除了令人难以置信的粗略 url 之外,还有消息称 get 的长度可能存在限制,所以如果我有大量的 ID 怎么办?

第二个似乎更好,因为没有粗略的 url,但我对其余部分的理解是 POST 应该进行更改,而不是幂等..

那么这是否纯粹是一个语义问题并且没有真正的 "correct" 方式?

没有一种 "correct" 方式,这实际上取决于 REST 服务器的特定要求。但是,对于带有查询字符串的 GET,它可能看起来更像这样:

GET api/stuff?ids=123+456+789+101112+...

或者像这样:

GET api/stuff?ids=123,456,789,101112,...

或者这样:

GET api/stuff?ids=123|456|789|101112|...

服务器要使用的任何定界符。

与 REST 中的许多东西一样,不可能总是纯粹主义者。

一个解决方案是灵活定义资源是什么。那么,获取多个资源本身就是一种资源。

POST 可以是幂等的,如果这对您的 API 来说是最好的。只是 PUT 应该始终是幂等的,而 POST 可以不这样做。只需正确记录端点即可。

您可以允许接受来自 GET 和 POST 的 ID。然后根据发送的 ID 数量,客户端可以选择其中一个。只需正确记录即可。

指导原则是您的 API 的易用性和一致性。了解制作 API 是一个用户体验问题。

我会用POST,因为:

POST requests are never cached (by browser)
POST requests have no restrictions on data length

阅读更多:HTTP Methods: GET vs. POST

另外 POST,GET 在 REST 之前定义。因此,对某些只读请求使用(有时!)POST 并不可耻。


编辑:

几年后,我必须修改我的答案。

今天我认为 GET 和 POST 都不是真正问题的好解决方案。至少,这里没有最终的解决方案,要看...

首先是一些事实:

  • 受限但可配置
  • 对 GET 使用 POST 并不可耻,但肯定是一种反模式

那你一定要弄清楚,这个ID-list的来源是什么,ID是从哪里来的?这当然有一些商业案例。

我会尝试将 ID 的来源或创建 ID 的逻辑移至后端。完成后,REST 端点 “get for multiple resources” 是不必要的。

所以消息是,当您不能使用 GET

时,请尝试消除对此类 REST 调用的需要