REST api:在一次获取中请求多个资源[重复]

Posted

技术标签:

【中文标题】REST api:在一次获取中请求多个资源[重复]【英文标题】:REST api: requesting multiple resources in a single get [duplicate] 【发布时间】:2012-03-11 09:18:22 【问题描述】:

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

单品网址很简单:

http://mycompany.com/api/v1/product/id

这将返回单个产品的信息。我对多个产品信息的 URL 应该是什么样子感到困惑。

怎么样

http://mycompany.com/api/v1/product/ids

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

【问题讨论】:

id 使用类似 http://mycompany.com/api/v1/getproducts?ids=[listofids] 关于 API 设计的问题如何与 Rails 中的实现细节问题重复? /getproducts... 是 RPC 风格,而不是 REST 【参考方案1】:

我建议您将其视为列出按 id 过滤的资源的多种表示形式。因此,您向基础资源发出 GET 请求:

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

并通过id过滤响应列表:

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

【讨论】:

这是最佳答案恕我直言,原因是:/productsproducts?id=1,2,3 将给出一致响应(=收集资源)。比较 /products/1/products/1,2,3 是让客户头疼的秘诀 - 当然,除非所有嵌套端点默认返回集合(这也是一种有趣的方法,例如,请参见 api+json 格式) 我喜欢这种方法,但不应该是example.com/api/v1/products?id=1&id=2&id=3 吗? @Nitek 没有; there is no guarantee 重复的查询参数将被组合成一个数组。对于您的示例 URL,php 确实会告诉您 id 等于 [1, 2, 3],但 Ruby on Rails 会告诉您它等于 3,并且其他框架的行为也可能不同,例如说id 等于1 我希望products?id= 不会返回任何结果,而products 会返回所有结果。 @ma11hew28 因为id 是要匹配的对象上的字段。【参考方案2】:

您对用逗号分隔的 id 的建议已经足够了。

检查一些公共 REST API 以了解它们的处理方式会很有启发性。例如,StackExchange API 用分号分隔 id - https://api.stackexchange.com/docs/answers-by-ids

【讨论】:

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

以上是关于REST api:在一次获取中请求多个资源[重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头

尝试从 REST API 获取数据时,请求的资源上不存在“Access-Control-Allow-Origin”标头