如何使用 json 补丁更新集合

Posted

技术标签:

【中文标题】如何使用 json 补丁更新集合【英文标题】:How to update a collection using json patch 【发布时间】:2015-07-08 08:56:41 【问题描述】:

我在使用 JSON Patch 更新集合的过程中找不到示例。事实上,我想在集合 REST 资源上使用方法 PATCH 以更新关联的集合,而无需再次发送整个集合。我想知道 JSON Patch 是否可以匹配来描述要执行的操作:主要是添加元素或删除元素。元素很复杂,这意味着它们不是原始元素。

下面有更多细节。让我们以资源contacts为例:

GET /contacts
[
  
    "id": "1",
    "lastName": "Last name 1",
    "firstName": "First name 1"
  ,
  
    "id": "2",
    "lastName": "Last name 2",
    "firstName": "First name 2"
  ,
  
    "id": "3",
    "lastName": "Last name 3",
    "firstName": "First name 3"
  ,
  (...)
]

这是我想使用的 PATCH 请求,但我不确定它是否符合 JSON Patch:

PATCH /contacts
[
  
    "op": "add", "value": 
      "firstName": "my first name",
      "lastName": "my last name"
    
  ,
  
    "op": "remove", "path": "id=='1'"
  
]

我的主要问题是如何根据其字段id 识别要删除的元素。有没有专门的表达方式?我想到了类似的东西:id=='1'

最后一个问题:响应内容是JSON Patch针对的吗?

非常感谢您的帮助! 蒂埃里

【问题讨论】:

【参考方案1】:

您应该能够简单地使用要删除的资源的路径。

PATCH /contacts
[
  
    "op": "add",
    "path": "/-",
    "value": 
      "firstName": "my first name",
      "lastName": "my last name"
    
  ,
  
    "op": "remove", 
    "path": "/0"
  
]

环顾四周,似乎对此有些困惑,但standard says““删除”操作会删除目标位置的值”,例如:

 "op": "remove", "path": "/a/b/c" 

【讨论】:

关于补丁响应的任何提示? 标准没有说。它应该是一个原子事务,所以从技术上讲,不需要返回任何信息,因为客户端可以假设一切都改变了,或者什么都没有改变。如果确实发生了错误,您通常希望至少包含每个操作的错误消息。 事实上,我看到响应中可能会返回两件事 ;-) :创建元素的标识符(在自动生成的 pk 的情况下)和验证错误。我们在 API 后面有一个 noSQL 后端,所以我们没有事务...... 没错,应该返回(可能更多)新资源的 ID。 @helpermethod 感谢您指出这一点,标准强制执行此操作似乎是合理的。这只是意味着客户端需要记住调用上下文,这是正确的做法,原则上应该很容易,但令人惊讶的是,在许多 http 客户端库(web/JS 或其他)中没有得到很好的支持。

以上是关于如何使用 json 补丁更新集合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala Slick 中运行补丁/部分数据库更新?

Linux系统有漏洞吗,若有,如何打补丁?更新升级是自动的吗,若否,命令是啥?

如何使用 python mongodb 客户端库(pymongo)更新 mongodb 集合中所有文档的字段“类型”

如何制作windows server 2012的离线补丁升级包

如何查看电脑已打的补丁

电脑怎么打补丁