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

时间:2016-03-21 23:03:00

标签: rest api-design

是吗:

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

是吗:

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

第一个看起来在语义上是正确的,但除了有一个令人难以置信的粗略网址之外,还有消息来源说这可能会限制获取的长度,那么如果我有一个巨大的ID呢?

第二个似乎更好,因为没有粗略的网址,但我对休息的理解是POST应该做出改变,而不是幂等...

因此,这纯粹是一个语义问题,并且没有真正的"正确的"方式是什么?

3 个答案:

答案 0 :(得分:3)

没有一种“正确”的方式,它实际上取决于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|...

服务器想要使用哪种分隔符。

答案 1 :(得分:3)

与REST中的许多内容一样,并不总是纯粹的。

一种解决方案是灵活定义资源的定义。然后,获取多个资源本身就是一种资源。

如果这对您的API最有用,那么POST可以是幂等的。这只是PUT应该始终是幂等的,而POST可以承受不起。只需正确记录端点。

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

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

答案 2 :(得分:1)

我会使用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并不是一种耻辱。