Spring REST和PATCH方法

fvi*_*cot 9 spring spring-boot spring-rest

我正在使用SpringBoot和Spring REST.我想了解HTTP PATCH方法来更新我的Model的属性

是否有任何好的教程解释如何使其工作?

  • HTTP PATCH方法和正文发送
  • 控制器方法以及如何管理更新操作

Nox*_*Nox 11

我注意到许多提供的答案都是 JSON 修补或不完整的答案。下面是一个完整的解释和例子,说明你需要使用真实世界的代码

首先,PATCH 是一个选择性的 PUT。您可以使用它来更新对象或对象列表的任意数量的字段。在 PUT 中,您通常会发送带有任何更新的整个对象。

补丁/对象/7

{
   "objId":7,
   "objName": "New name"
}
Run Code Online (Sandbox Code Playgroud)

放置/对象/7

{
   "objId":7,
   "objName": "New name",
   "objectUpdates": true,
   "objectStatus": "ongoing",
   "scoring": null,
   "objectChildren":[
       {
          "childId": 1
       },
     ............ 
}
Run Code Online (Sandbox Code Playgroud)

这允许您在没有大量端点的情况下更新记录。例如,在上面,要更新评分,您需要 object/{id}/scoring,然后要更新 name,您需要 object/{id}/name。每个项目都有一个端点,或者您需要前端为每次更新发布整个对象。如果您有一个巨大的对象,这可能会占用大量的网络时间或不必要的移动数据。该补丁可让您拥有 1 个端点,其中包含移动平台应使用的最小对象属性发送。

这是补丁在现实世界中的使用示例:

{
   "objId":7,
   "objName": "New name"
}
Run Code Online (Sandbox Code Playgroud)

上述内容可能会让某些人感到困惑,因为新的开发人员通常不会像这样处理反射。基本上,无论您在正文中传递这个函数,它都会使用给定的 ID 找到关联的声明,然后只更新您作为键值对传递的字段。

示例体:

补丁/索赔/7

{
   "claimId":7,
   "claimTypeId": 1,
   "claimStatus": null
}
Run Code Online (Sandbox Code Playgroud)

以上将更新 claimTypeId 和 claimStatus 为声明 7 的给定值,保持所有其他值不变。

所以回报将是这样的:

{
   "claimId": 7,
   "claimSrcAcctId": 12345678,
   "claimTypeId": 1,
   "claimDescription": "The vehicle is damaged beyond repair",
   "claimDateSubmitted": "2019-01-11 17:43:43",
   "claimStatus": null,
   "claimDateUpdated": "2019-04-09 13:43:07",
   "claimAcctAddress": "123 Sesame St, Charlotte, NC 28282",
   "claimContactName": "Steve Smith",
   "claimContactPhone": "777-555-1111",
   "claimContactEmail": "steve.smith@domain.com",
   "claimWitness": true,
   "claimWitnessFirstName": "Stan",
   "claimWitnessLastName": "Smith",
   "claimWitnessPhone": "777-777-7777",
   "claimDate": "2019-01-11 17:43:43",
   "claimDateEnd": "2019-01-11 12:43:43",
   "claimInvestigation": null,
   "scoring": null
}
Run Code Online (Sandbox Code Playgroud)

如您所见,完整对象将返回,而不会更改您想要更改的任何数据。我知道这里的解释有一些重复,我只是想清楚地概述一下。


jny*_*jny 2

PATCH就 Spring 而言,方法与PUT和没有本质上的不同POST。挑战在于您在 PATCH 请求中传递的内容以及如何在控制器中映射数据。如果您使用 映射到值 bean @RequestBody,则必须弄清楚实际设置的内容以及 null 值的含义。其他选项是将PATCH请求限制为一个属性并在 url 中指定它或将值映射到Map. 另请参见Spring MVC PATCH 方法:部分更新

  • PATCH http://example.com/api/entity/1 HTTP/1.1 是否有任何实用程序类可以理解 op/path 元素?Content-Type: application/json-patch+json [ { "op": "replace", "path": "aBoolean", "value": true } ] (4认同)