Http 什么';不允许部分看跌期权的理由是什么?

Http 什么';不允许部分看跌期权的理由是什么?,http,rest,Http,Rest,为什么HTTP PUT请求必须包含“整体”状态的表示,而不能只是部分状态 我理解这是PUT的现有定义-这个问题是关于为什么会这样定义的原因 i、 e: 防止部分看跌期权能带来什么好处 为什么阻止幂等部分更新被认为是一种可接受的损失?因为,我猜,当多个并发客户端访问该状态时,这会转化为不一致的“视图”。就我所知,REST中没有“部分文档”语义,在并发上下文中处理该语义的复杂性面前添加该语义的好处可能不值得付出努力 如果文档很大,那么没有什么可以阻止您构建多个独立的文档,并拥有一个将它们连接在一起的

为什么HTTP PUT请求必须包含“整体”状态的表示,而不能只是部分状态

我理解这是PUT的现有定义-这个问题是关于为什么会这样定义的原因

i、 e:

防止部分看跌期权能带来什么好处


为什么阻止幂等部分更新被认为是一种可接受的损失?

因为,我猜,当多个并发客户端访问该状态时,这会转化为不一致的“视图”。就我所知,REST中没有“部分文档”语义,在并发上下文中处理该语义的复杂性面前添加该语义的好处可能不值得付出努力

如果文档很大,那么没有什么可以阻止您构建多个独立的文档,并拥有一个将它们连接在一起的总体文档。此外,一旦收集了所有的信息,我想可以在服务器上整理新文档


因此,考虑到可以“解决”这个“限制”,我可以理解为什么这个特性没有被切掉。

PUT意味着HTTP规范对它的定义。客户端和服务器无法改变这一含义。如果客户端或服务器使用PUT的方式与其定义相矛盾,至少可能会发生以下情况:

根据定义,Put是幂等的。这意味着客户(或中间人!)可以多次重复看跌期权,并确保效果相同。假设中介收到来自客户机的PUT请求。当它将请求转发到服务器时,存在网络问题。根据定义,中介体知道它可以重试PUT,直到成功。如果服务器以非幂等方式使用PUT,这些潜在的多次调用将产生不希望的效果

如果要执行部分更新,请在子资源上使用补丁或使用POST,并将303 See OTHE返回到“主”资源,例如


POST /account/445/owner/address
Content-Type: application/x-www-form-urlencoded

street=MyWay&zip=22222&city=Manchaster


303 See Other
Location: /account/445
编辑:关于为什么部分更新不能等幂的一般问题:


部分更新通常不能是幂等的,因为幂等性取决于媒体类型语义。这样,您可能可以指定一种允许幂等修补程序的格式,但不能保证修补程序对每种情况都是幂等的。由于方法的语义不能是媒体类型的函数(出于正交性原因),因此需要将补丁定义为非幂等。和PUT(定义为幂等元)不能用于部分更新。

简短回答:PUT操作的酸度和更新实体的状态

长答案:

RFC 2616:第2.5段,“POST方法要求所附实体被接受为所请求URL的新下属”。第2.6段,“PUT方法要求将封闭实体存储在指定的URL”

因为每次执行POST时,语义都是在服务器上创建一个新的实体实例,所以POST构成了一个ACID操作。但是,在主体中使用相同的实体重复相同的POST两次仍然可能导致不同的结果,例如,如果服务器已耗尽存储空间来存储需要创建的新实例,则POST不是幂等的


另一方面,PUT具有更新现有实体的语义。即使部分更新是幂等的,也不能保证它是酸性的,并导致一致有效的实体状态。因此,为了确保酸性,PUT语义要求发送完整的实体。即使这不是HTTP协议作者的目标,PUT请求的幂等性也会作为强制ACID的副作用发生


当然,如果HTTP服务器非常了解实体的语义,它可以允许部分PUT,因为它可以通过服务器端逻辑确保实体的一致性。然而,这需要数据和服务器之间的紧密耦合。

对于完整的文档更新,显然不知道特定API的任何细节,也不知道它对文档结构的限制是什么,更新后生成的文档是什么


如果已知某个方法从未进行过部分内容更新,并且某个人提供的API仅支持该方法,然后,使用API的人必须做什么才能更改文档以获得给定的有效内容,这一点总是很清楚的。

抱歉-我不理解部分幂等更新产生的不一致视图在行为上与“完全”幂等更新不同。从协议定义的角度来看,我也不确定建议增加的复杂性;“据我所知,这是PUT的现有定义——这个问题是关于为什么会这样定义的原因。”。您在第2段中的示例暗示部分更新是非幂等的-显然这就是补丁的用途。我对幂等部分更新感兴趣-即,正在重新添加部分PUT.PATCH。也;Jan-幂等性不需要依赖于协议中关于其定义的任何特定媒体类型集,方法的语义是其定义的函数,作为统一接口的一部分。。通过将PUT的定义改为“状态的幂等变换”(即不阻止partials的变换),我仍在努力找出到底丢失了什么。我不知道partialput是如何打破幂等性的。当然,一个实现可以打破这一点,因为它可以为一个GET。此外,RFC没有严格提到PUT不能是部分更新。HTTP1.1bis现在明确说明PUT不适用于部分更新:(最后第二段)FWIW在讨论的这么晚的时候,有几个例子说明了为什么部分更新仅与所涉及的媒体类型有关: