REST api:在单个get中请求多个资源

use*_*212 65 api rest

我正在尝试设计RESTful API,用户可以在单个GET请求中获取单个产品或产品列表.每个产品都有一个唯一的ID.

单个产品网址很简单:

http://mycompany.com/api/v1/product/id
Run Code Online (Sandbox Code Playgroud)

这将返回单个产品的信息.我很困惑多个产品信息的URL应该是什么样子.

怎么样

http://mycomapny.com/api/v1/product/ids
Run Code Online (Sandbox Code Playgroud)

其中id是以逗号分隔的ID列表?

abr*_*ham 118

我建议您考虑它,就像您列出了由id过滤的资源的多个表示.因此,您GET向基本资源发出请求:

https://example.com/api/v1/products

并通过id以下方式过滤响应列表:

https://example.com/api/v1/products?id=1,2,3

  • 这是优秀的答案imho,原因是:`/ products`和`products?id = 1,2,3`将给出__consistent__响应(=收集资源).比较`/ products/1`和`/ products/1,2,3`是客户头痛的一个秘诀 - 除非所有嵌套端点默认返回集合(这也是一个有趣的方法,例如参见[api] + json](http://jsonapi.org/)格式) (27认同)
  • @Nitek没有; [无法保证](http://stackoverflow.com/q/1746507/578288)重复的查询参数将合并到一个数组中.对于你的示例URL,PHP确实会告诉你`id`等于`[1,2,3]`,但Ruby on Rails会告诉你它等于`3`,而其他框架也可能有不同的行为,比如说`id `等于`1`. (7认同)
  • 我希望`products?id =`不返回任何结果和`products`来返回所有结果. (4认同)
  • 我喜欢这种方法,但不应该是 https://example.com/api/v1/products?id=1&id=2&id=3 吗? (2认同)

ald*_*rin 47

你用逗号分隔的id的建议已经足够了.

检查一些公共REST API以了解它们如何处理将是有益的.例如,StackExchange API使用分号分隔ID - https://api.stackexchange.com/docs/answers-by-ids

  • @JulioGreff我想,这是因为它看起来有点难看.没有其他特殊原因. (10认同)
  • @JulioGreff RESTful api不只是按id选择,它们也装饰.示例`/ api/dogs/fluffy1234`可以扩展为执行更多这样的操作:`/ api/dogs/fluffy1234/siblings`等等,如果你可以将选择器逻辑保持在ID通常所在的相同位置,那么你仍然可以使用装饰器 (4认同)
  • 我想知道为什么人们不使用产品?id[]=1&id[]=2。URL 解析器可以很好地处理这个问题。 (2认同)
  • 通过一系列“GET 产品”请求,性能也会更好,因为服务器对聚合查询的响应时间永远不会比查找需要最长返回时间的产品更快。另外,您不能将“某些项目未找到”指示为响应代码,这通常会导致肮脏的解决方法,例如使用 WebDAV 的 HTTP 207 (2认同)