gpt4 book ai didi

web-services - 部分更新 RESTful 服务中的复杂类型

转载 作者:行者123 更新时间:2023-12-04 06:37:42 25 4
gpt4 key购买 nike

我将 JSON 与 RESTful 服务一起使用。实现是这样的。

获取上 http://hostname/a返回

{
"a": {
"b": {
"c1": "data1",
"c2": "data2"
}
}
}

获取上 http://hostname/a/b返回
{
"b": {
"c1": "data1",
"c2": "data2"
}
}

我想知道 http://hostname/a 上 POST(和 PUT)的正确行为
{
"a": {
"b": {
"c1": "newdata"
}
}
}

它应该只是用值“newdata”更新c1还是应该替换整个资源b,从而只包含c1(即c2被覆盖并且不再存在)

最佳答案

在我过去几年处理 REST 的过程中,您遇到了最具争议的问题之一。

这是简单的答案:
普遍的共识是 HTTP PUT 方法已替换语义,因此 c2 被覆盖并且不再存在。
最近引入了 PATCH 方法来帮助人们处理部分更新。

现在,这里有两个复杂的场景:
1)为什么PUT必须有replace语义?进行部分更新有什么负面影响?我还没有听到一个真正令人信服的论点。

实际上,HTTP 规范并没有明确说 PUT 具有替换语义,它 says :

The PUT method requests that the enclosed representation be stored at the effective request URI



然而,它也说

HTTP/1.1 does not define how a PUT method affects the state of an origin server.



2)可以接受的是,如果您假设 PUT 具有替换语义,则服务器可能会在未替换的表示中包含某些内容。例如如果表示包含链接,则对不包含这些链接的表示执行 PUT 不会“删除”这些链接。时间戳字段或上次修改的数据也是如此。永恒的问题是我们如何定义哪些内容被客户端忽略时被删除,哪些内容因为服务器这么说而保留!

就我个人而言,我避免使用 PUT,因为我发现“替换”语义过于严格。然而,最近我开始被 Mike Kelly 说服了。和 Mike Amundsen也许 PUT 应该被认为比我们目前认为的更灵活。

关于web-services - 部分更新 RESTful 服务中的复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com