使用JQuery PATCH进行部分更新

时间:2016-08-14 19:08:45

标签: jquery json ajax rest http

好的,我的网址(example.com/api/content/12)按以下格式返回JSON数据:

{
    "title" : "My blog post",
    "body" : "Body",
    "data" : "old"
}

我只想简单地对数据字段进行更改。目前,我正在使用PUT,基本上只是替换整个事物,我意识到这是无效的。像这样:

var data = {
    "title" : "My blog post",
    "body" : "Body",
    "data" : "New data"
}

$.ajax({
   url: 'http://example.com/api/content/12',
   data: data,
   error: function() {
      console.log('Error');
   },
   dataType: 'json',
   success: function(data) {
      console.log('success');
   },
   type: 'PUT'
});

如何使用PATCH执行此操作?我不需要发送标题和正文字段,因为它们不会改变。我只是想更新数据字段。

1 个答案:

答案 0 :(得分:1)

对于指定的用例,最简单的方法是使用JSON Merge Patch,如下所示:

var patch = {
    "data" : "New data"
}

$.ajax({
   type: 'PATCH',
   url: 'http://example.com/api/content/12',
   data: JSON.stringify(patch),
   processData: false,
   contentType: 'application/merge-patch+json',

   /* success and error handling omitted for brevity */
});

processData: falsedata: JSON.stringify(patch)会覆盖jQuery的PATCH默认序列化(不是JSON)并强制进行JSON序列化。

请注意,JSON Merge Patch具有固有的局限性(例如,您无法仅更新数组中的某些元素,无法将键设置为null等),因此对于更复杂的实现,我会鼓励OP考虑JSON Patch

var patch = [
    { "op": "replace", "path": "/data", "value": "New data" },
]

$.ajax({
   type: 'PATCH',
   url: 'http://example.com/api/content/12',
   data: JSON.stringify(patch),
   processData: false,
   contentType: 'application/json-patch+json',

   /* success and error handling omitted for brevity */
});