Http REST-修改资源的一部分-PUT或POST
关于如何使用REST只更新资源的一部分(例如状态指示器),我看到了很多人在讨论这个问题 选择似乎是:Http REST-修改资源的一部分-PUT或POST,http,rest,http-headers,httpverbs,Http,Rest,Http Headers,Httpverbs,关于如何使用REST只更新资源的一部分(例如状态指示器),我看到了很多人在讨论这个问题 选择似乎是: 抱怨HTTP没有补丁或修改命令。然而,关于的公认答案很好地说明了为什么这不是一个看起来那么好的主意 使用带有参数的POST并识别方法(例如,名为“action”的参数)。一些建议是使用自定义方法名称指定X-HTTP-Method-Override头。这似乎导致了在实现中根据您试图做的事情进行切换的丑陋性,并且对不是一种特别安静的POST使用方式的批评持开放态度。事实上,采用这种方法开始感觉像RP
这是最佳实践还是反模式?还有其他选项吗?查看状态更新有两种方法
在解释这一点之前,可能值得一提的是,使用POST进行常规更新并没有什么错(请参阅): POST只有在其他方法非常适合的情况下使用时才会成为问题:例如,检索应该是某个资源表示形式的信息(GET),完全替换表示形式(PUT) 实际上,我们应该使用补丁对复杂的资源进行小的更新,但它并不像我们希望的那样广泛可用。我们可以使用附加属性作为POST的一部分来模拟补丁
我们的服务需要对SAP、Flex、Silverlight、Excel等第三方产品开放。这意味着我们必须使用最低公分母技术——有一段时间我们无法使用PUT,因为所有客户端技术都只支持GET和POST 我采用的方法是将“\u method=patch”作为POST请求的一部分。好处是, (a) 在服务器端很容易处理-我们基本上是假装补丁可用 (b) 它向第三方表明,我们并没有违反REST,而是绕过了浏览器的限制。这也与几年前Rails社区处理PUT的方式一致,因此许多人应该能够理解 (c) 当补丁变得更广泛可用时,它很容易更换 (d) 这是对一个棘手问题的务实回应。补丁适用于补丁或差异格式。在那之前,它一点用处都没有 对于使用自定义方法的解决方案2,无论是在请求中还是在头中,都是如此,不,不,这太糟糕了:) 只有两种方法是有效的,要么放入整个资源,修改子数据,要么发布到该资源,要么放入子资源
<>这取决于资源的粒度和缓存的预期结果。 有点晚,但我会考虑使用这样的场景。 在其核心,它需要资源的两个副本(原始副本和修改副本),并对其执行diff。diff的结果是一系列描述差异的补丁操作 例如:
[
{ "op": "replace", "path": "/baz", "value": "boo" },
{ "op": "add", "path": "/hello", "value": ["world"] },
{ "op": "remove", "path": "/foo" }
]
有很多方法可以在generata中完成繁重的工作在实践中,最好暂时坚持使用POST,或者只是将您的资源拆分为子资源并应用到这些子资源中。缺少工具是否是一个问题当然取决于您拥有的工具,对吗?所以我建议尝试,而不是事先放弃这个选项。补丁解决了一个小问题,这个问题已经可以通过POST和一些常识来解决了——几乎可以肯定它会被滥用和破坏