Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 修补集合时的响应正文_Rest_Put_Http Put_Http Patch - Fatal编程技术网

Rest 修补集合时的响应正文

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方法更新集合。虽然两种方法都需要非常不同的请求机构,但我相信

在我的RESTAPI中,我有一个非常大的集合;它包含数百万个项目。此集合的路径是
/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中有许多有用的用途,包括“此操作不值得标准化”的一般用途