Rest 修补集合时的响应正文
在我的RESTAPI中,我有一个非常大的集合;它包含数百万个项目。此集合的路径是Rest 修补集合时的响应正文,rest,put,http-put,http-patch,Rest,Put,Http Put,Http Patch,在我的RESTAPI中,我有一个非常大的集合;它包含数百万个项目。此集合的路径是/mycollection 由于此集合太大,因此获取整个集合以使API支持分页是不好的做法。分页将是获取集合的主要方式 GET /mycollection?page=1&page-size=100 HTTP/1.1 假设原始集合包含1000000项,我想更新5000项、删除3000项和添加2000项。我可以编写API来支持通过PUT方法或PATCH方法更新集合。虽然两种方法都需要非常不同的请求机构,但我相信
/mycollection
由于此集合太大,因此获取整个集合以使API支持分页是不好的做法。分页将是获取集合的主要方式
GET /mycollection?page=1&page-size=100 HTTP/1.1
假设原始集合包含1000000项,我想更新5000项、删除3000项和添加2000项。我可以编写API来支持通过PUT
方法或PATCH
方法更新集合。虽然两种方法都需要非常不同的请求机构,但我相信两种方法都需要完全相同的响应机构,即响应机构必须包含整个更新资源的当前表示,即集合中的所有999000项
正如我前面提到的,整个收藏都是不现实的;太大了。出于同样的原因,我不希望PUT
ting或PATCH
ing返回整个集合。将查询参数添加到PUT
或PATCH
请求也不起作用,因为PUT
或PATCH
都不是安全的方法
那么,在这个大型收集场景中,正确的响应是什么呢
我可以用
HTTP/1.1 202 Accepted
Location: /mycollection?page=1&page-size=100
202接受的
响应代码感觉不正确,因为更新是同步完成的。位置
标题也不太合适。我可能会使用链接
标题,但感觉还是不对
我再次问,在这种大规模收集的情况下,正确的回答是什么?这个问题基于一种误解:
虽然这两种方法都需要非常不同的请求机构,但我相信这两种方法都需要完全相同的响应机构,即响应机构必须包含整个更新资源的当前表示
可以只返回204无内容
或200正常
且无响应正文。没有要求他们在回复中包含完整的表示
您可以选择支持此功能(可能与首选:return=representation
标题一起使用,或者可能与Content Location
标题一起使用),但是如果没有此标题,我想说返回当前表示甚至不是一种惯例。除非使用这些标头,否则通用客户端不应假定响应主体是新的表示形式
所以,只要返回一个2xx
,就可以开始了
那么,在这个大型收集场景中,正确的响应是什么呢
简短的版本:你应该把一个成功的看跌期权当作一篇成功的文章来对待
有效载荷的预期含义可概括为:
行动的状态或结果的表示
因此,答案可以简单到
200 OK
Content-Type: text/plain
It worked!
详细回答:
虽然这两种方法都需要非常不同的请求机构,但我相信这两种方法都需要完全相同的响应机构,即响应机构必须包含整个更新资源的当前表示
这是不对的-如果您回顾一下,您将看到对PUT的响应有这样的描述
动作状态的表示
返回资源的新表示形式是一种边缘情况,而不是默认情况(请参见标题的说明)
对于状态更改请求,如PUT(第4.3.4节)或POST(第4.3.3节),这意味着服务器的响应包含该资源的新表示形式,从而将其与可能仅报告操作的表示形式区分开来(例如,“它工作了!”)。这允许创作应用程序更新其本地副本,而无需后续GET请求
也就是说,我建议您对方法令牌的选择进行审查。PUT和PATCH都支持远程创作语义—要求服务器使其文档副本看起来像您的本地副本的消息。这就是为什么,例如,该规范有一系列关于向响应中添加验证器头字段的约束。通用组件可以假定它们知道发生了什么,因为所有资源都应该以相同的方式理解这些方法
但在您的情况下,不能说您是在远程编写集合,因为客户端(和通用组件)没有集合的表示形式,而只有集合页面的表示形式
如果要与统一接口保持一致,那么
- 允许远程编写页面,或
- 放弃暗示远程创作的方法标记
当请求的语义与标准化的含义不完全一致时
POST在HTTP中有许多有用的用途,包括“此操作不值得标准化”的一般用途