Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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
Web services 部分更新RESTful服务中的复杂类型_Web Services_Json_Rest_Post_Put - Fatal编程技术网

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

Web services 部分更新RESTful服务中的复杂类型,web-services,json,rest,post,put,Web Services,Json,Rest,Post,Put,我将JSON与RESTful服务一起使用。实现是这样的 返回 返回 我想知道POST(和PUT)的正确行为 它应该用值“newdata”更新c1,还是应该替换整个资源b,从而只包含c1(即c2被覆盖,不再存在)首先,如果您更改了“b”资源,为什么不将POST(或PUT)发送到而不仅仅是?如果有值得指出/链接的内容,根据RIA的理念,应该将其作为资源来实现,并拥有自己的URI。您已经发现了我在过去几年处理REST时遇到的最有争议的问题之一 下面是一个简单的答案: 普遍的共识是HTTP PUT方法具

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

返回

返回

我想知道POST(和PUT)的正确行为


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

首先,如果您更改了“b”资源,为什么不将POST(或PUT)发送到而不仅仅是?如果有值得指出/链接的内容,根据RIA的理念,应该将其作为资源来实现,并拥有自己的URI。

您已经发现了我在过去几年处理REST时遇到的最有争议的问题之一

下面是一个简单的答案:
普遍的共识是HTTP PUT方法具有替换语义,因此c2被覆盖,不再存在。
最近引入了补丁方法来帮助人们处理部分更新

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

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

PUT方法要求 附呈的申述书须存放於 有效的请求URI

然而,它也说

HTTP/1.1没有定义PUT的方式 方法影响原点的状态 服务器

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

就我个人而言,我避免使用PUT,因为我发现“replace”语义太过约束。然而,最近我开始相信,也许PUT应该被认为比我们目前认为的更灵活。

如果你考虑到的缓存副本会发生什么情况?允许它们不同步多长时间

如果答案是“它们没有被缓存”


“分层系统的主要缺点是,它们增加了数据处理的开销和延迟,降低了用户感知的性能。对于支持缓存约束的基于网络的系统,这可以通过在中间层共享缓存的好处来抵消。”——一篇著名的论文。

问题仍然是一样的,不管他是把球打到a还是B,以上只是一个例子。在我们的例子中,c1是一组设置的启用标志。所以问题仍然存在,当我们只是启用设置时,我们只能将启用的字段设置为true。它们可以立即失效:我没有听到任何令人信服的理由不进行部分更新,导致了这个问题。我想唯一令人信服的原因可能是它增加了更多的工作量。第二点是确保,因为当客户机省略时,我们可能会有一些字段不被删除。
{
    "a": {
        "b": {
            "c1": "data1",
            "c2": "data2" 
        } 
    }
}
{
    "b": {
        "c1": "data1",
        "c2": "data2" 
    } 
}
{
    "a": {
        "b": {
            "c1": "newdata" 
        } 
    }
}