Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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 PUT操作幂等_Rest_Http - Fatal编程技术网

使用版本控制时如何正确地使REST PUT操作幂等

使用版本控制时如何正确地使REST PUT操作幂等,rest,http,Rest,Http,我知道REST-PUT运算应该是幂等的。我知道它们是为支持版本控制而设计的(因此,如果我尝试更新一个对象,其中我有旧版本4,但新版本是5,我应该得到409冲突响应。但是处理幂等性和版本控制的正确方法是什么 假设我的对象有一个版本和一个数据字段(例如“name”)。如果我当前的对象位于/objects/1,版本1名为“alice”,我想用nam“bob”将其更新为版本2,我可能会发送一个版本2名为“bob”的PUT。但是,由于它是幂等的,我应该能够重复发送它,并且效果与单个调用相同。后续调用不会r

我知道REST-PUT运算应该是幂等的。我知道它们是为支持版本控制而设计的(因此,如果我尝试更新一个对象,其中我有旧版本4,但新版本是5,我应该得到409冲突响应。但是处理幂等性和版本控制的正确方法是什么

假设我的对象有一个版本和一个数据字段(例如“name”)。如果我当前的对象位于/objects/1,版本1名为“alice”,我想用nam“bob”将其更新为版本2,我可能会发送一个版本2名为“bob”的PUT。但是,由于它是幂等的,我应该能够重复发送它,并且效果与单个调用相同。后续调用不会r通常无法通过版本控制检查,除非它们的其他数据与服务器上的数据相匹配,并且可以检测为(或至少假定为)重复请求

对所有重复调用的响应是否相同(例如200 OK或204 No Content)?或者响应代码是否指示调用是否实际进行了更改(并增加了版本),或者是否检测到重复调用(除了PUT中的数据与已经存在的数据相同之外,还有什么会被标记为409冲突)?如果应该指出差异,在响应中区分它们的适当方式是什么

而且,我想我还应该询问REST版本控制通常是在对象中完成的(例如,使用REST对象的版本字段),还是在REST协议中完成的(例如,作为HTTP字段,保持对象“干净”)

对所有重复呼叫的响应是否应相同(例如,200 OK或204 No Content)

是-HTTP规范的相关部分在中。请查看以下说明:

如果接收到的if匹配条件评估为false,则源服务器不得执行请求的方法;相反,源服务器必须使用a)412(前提条件失败)状态代码或b)2xx(成功)之一进行响应如果源服务器已验证正在请求状态更改,并且最终状态已反映在目标资源的当前状态中,则状态代码(即,用户代理请求的更改已经成功,但用户代理可能没有意识到,这可能是因为先前的响应丢失或某个其他用户代理进行了兼容更改)。在后一种情况下,源服务器不得在响应中发送validator标头字段,除非它可以验证该请求是否与同一用户代理之前所做的更改重复

我的理解是,服务器不需要验证更改是否已经成功;但如果它执行了这样的检查,并希望将结果传达给客户端,则可以这样做

我看不出有什么理由不适用于可能使用状态码的情况

我想我还应该询问REST版本控制通常是在对象中完成的(例如,使用REST对象的版本字段),还是在REST协议中完成的(例如,作为HTTP字段,保持对象“干净”)

并非所有媒体类型都能方便地将版本控制元数据嵌入到资源表示中(我们对图像使用与json文档相同的PUT),因此我想更典型的是在元数据中查看版本控制信息(也就是说,在标题中,如所述)

如果应该指出差异,那么在回答中区分它们的适当方式是什么

未指定;您可以做有意义的事情。如果是“成功”,您应该发送“操作状态的表示”以及2xx类状态代码(请参阅)。如果
409冲突
/
412先决条件失败
-由于这些状态代码是4xx类的成员,您应该发送“包含错误情况解释的表示,以及错误情况是暂时的还是永久的”(请参阅)


查看中的示例可能会有所帮助。

中的属性,如
幂等
安全
与请求的传输有关,而不一定与资源状态的检索有关。资源的版本控制通常通过ETag完成,或者如果从(和类似)起进行了修改headers.ETag生成资源状态的哈希值,如果您多次应用更新,它不会改变。最后一次修改的时间戳有点不同。因为您应该用收到的内容替换内容,所以您实际上也应该更新修改的时间戳,尽管这可能是一个需要讨论的问题。我建议您sing ETagsI不喜欢If-Modified,因为对于版本控制,粒度只有1秒,因此如果有高频更新,可能会出现误报。至于使用ETags进行版本控制,它肯定适用于“是否相同?”,但它似乎丢失了一些简单的自动递增整数提供的单调更新的版本系列。如果我尝试更新一个我认为是在版本4的对象,很高兴知道实际版本是6(或10)HTTP实际上不是一个版本控制协议。如果你想要这样一个功能,你需要切换到这样一个专用的协议,或者使用某种链接结构,你可以模拟这样一个功能。这就是为什么我计划在我的对象中这样做-有一个版本字段。然后,在PUT上,server将检查PUT版本是否为服务器版本+1(或者,为了检测重复调用,检查PUT版本是否与服务器版本相同,以及所有内容是否相同)。这不是通过REST进行版本控制的应用程序通常的做法吗?HTTP是这样做的