Spring REST 和 PATCH 方法

2024-01-07

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

有没有好的教程解释如何使其发挥作用?

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

我注意到许多提供的答案都是 JSON 修补或不完整的答案。以下是真实世界代码所需内容的完整说明和示例

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

补丁/对象/7

{
   "objId":7,
   "objName": "New name"
}

放置/对象/7

{
   "objId":7,
   "objName": "New name",
   "objectUpdates": true,
   "objectStatus": "ongoing",
   "scoring": null,
   "objectChildren":[
       {
          "childId": 1
       },
     ............ 
}

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

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

@ApiOperation(value = "Patch an existing claim with partial update")
@RequestMapping(value = CLAIMS_V1 + "/{claimId}", method = RequestMethod.PATCH)
ResponseEntity<Claim> patchClaim(@PathVariable Long claimId, @RequestBody Map<String, Object> fields) {

    // Sanitize and validate the data
    if (claimId <= 0 || fields == null || fields.isEmpty() || !fields.get("claimId").equals(claimId)){
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST); // 400 Invalid claim object received or invalid id or id does not match object
    }

    Claim claim = claimService.get(claimId);

    // Does the object exist?
    if( claim == null){
        return new ResponseEntity<>(HttpStatus.NOT_FOUND); // 404 Claim object does not exist
    }

    // Remove id from request, we don't ever want to change the id.
    // This is not necessary, you can just do it to save time on the reflection
    // loop used below since we checked the id above
    fields.remove("claimId");

    fields.forEach((k, v) -> {
        // use reflection to get field k on object and set it to value v
        // Change Claim.class to whatver your object is: Object.class
        Field field = ReflectionUtils.findField(Claim.class, k); // find field in the object class
        field.setAccessible(true); 
        ReflectionUtils.setField(field, claim, v); // set given field for defined object to value V
    });

    claimService.saveOrUpdate(claim);
    return new ResponseEntity<>(claim, HttpStatus.OK);
}

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

示例正文:

补丁/声明/7

{
   "claimId":7,
   "claimTypeId": 1,
   "claimStatus": null
}

上述代码会将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": "[email protected] /cdn-cgi/l/email-protection",
   "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
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring REST 和 PATCH 方法 的相关文章

随机推荐

  • 如何在 pytorch 中加载模型而不必记住使用的参数?

    我正在 pytorch 中训练一个模型 我为此创建了一个类 如下所示 from torch import nn class myNN nn Module def init self dense1 128 dense2 64 dense3 3
  • 如何测试所需的init(coder:)?

    在我的定制课程中WLNetworkClient我必须实现这样的方法 required init coder aDecoder NSCoder fatalError init coder has not been implemented 我不
  • Metro 的东西在什么桌面上运行?

    只是好奇 从 WinAPI 开发人员的角度来看 什么desktop http msdn microsoft com en us library ms682573 28v vs 85 29 aspxMetro 应用程序可以运行吗 这个东西 我
  • Spring 5 Web Reactive - 热门发布 - 如何使用 EmitterProcessor 将 MessageListener 桥接到事件流

    示例项目位于此处 https github com codependent spring5 playground https github com codependent spring5 playground 我想将从 JMS 队列接收到的
  • iOS 中如何锁定屏幕使其只有纵向方向?

    我创建了一个具有许多视图的应用程序 并且我希望其中一些视图仅处于纵向方向 我已将其编码在 m 文件中 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation in
  • 如何使 android-wheel 水平?

    我正在尝试从http code google com p android wheel http code google com p android wheel 并使其水平显示 我的第一次尝试来自于作者本人的建议http android de
  • 如何仅使用 sscanf 从字符串中提取所有数字?

    如何在 C 语言中使用 sscanf 从以下格式的字符串中提取所有数字 3 2 4 5 10 空格可以无处不在 但当然不能在数字之间 每个位置可以有 0 个或更多空格 字符串必须具有正确的格式 否则会出现错误 例如 3 2 是一个错误 每个
  • AWS:为什么我的 RDS 实例在关闭后仍继续启动?

    我在 AWS 上有一个 RDS 数据库实例 目前已将其关闭 但是 每隔几天它就会自行启动 我现在没有任何其他服务正在运行 我的 RDS 日志中有此事件 数据库实例正在启动 因为它超出了允许的最大停止时间 为什么我的 RDS 实例的停止时间有
  • 在 PHP 和 Eclipse 中设置路径映射

    我刚刚在本地设置了我的网站 这样我就可以更轻松地测试我的页面 Eclipse 已配置为在本地使用 XAMPP 服务器 问题是我想将我的项目映射到网站中的某个位置 IE 在我的 Eclipse PHP 项目中 我有一个名为 com 我想要这个
  • 渲染发生后以编程方式应用 jquery(移动)CSS 类

    jQuery 移动 http jquerymobile com 会根据内容自动为页面上的元素应用 css 和一些 htmldata 页面加载时属性就在它们上面 我通过 ajax 调用拉入一些 html 内容 但它是在 jquery mobi
  • 以给定概率得出 true 或 false

    我正在尝试用 C 编写一个函数 该函数将根据给定的概率返回 true 或 false 因此 例如 如果给定的概率为 0 634 则该函数有 63 4 的机会返回 true 我尝试了几种不同的方法 但都失败了 有什么帮助吗 如果您想在 C 1
  • 序列化对象时如何忽略事件订阅者?

    当下面的类被序列化时BinaryFormatter 订阅的任何对象Roar事件也将被序列化 因为对这些对象的引用由 EventHandler 委托保存 Serializable public class Lion public event
  • Javascript - 检测阿拉伯文本

    今天我想做一个使用输入文本的阿拉伯语测验 这是我的代码 我知道这仍然是基本的 但问题是它无法检测阿拉伯文本 语言 当我尝试输入 文本时 它显示 错误 警报 我不知道为什么它无法检测到阿拉伯语 有什么解决办法吗 function answer
  • 在MinGW编译器中,-mwindows命令是什么,它有什么作用?

    我在使用 C 程序时遇到问题 当我运行 exe 时 该程序将运行并且该程序的窗口将打开 但控制台将在后台桌面上打开 我进行了谷歌搜索 发现使用 mwindows 命令作为参数进行编译会删除控制台 它确实做到了 但我不确定它实际上是做什么的
  • Xamarin选择TargetFramework和MinimumAndroidVersion

    我正在开发一个 Xamarin Forms 应用程序 目前仅支持 Android 默认设置将 TargetFramework 设置为 7 1 该项目的最低 Android 版本必须为 7 0 这会产生一个警告 Xamarin Forms P
  • Google Analytics iOS SDK [GAIReachabilityCheckerreachabilityFlagsChanged:崩溃

    我的 iOS 应用程序不断遇到与 GAIReachabilityChecker 相关的崩溃 这个函数似乎崩溃了 GAIReachabilityCheckerreachabilityFlagsChanged 这是错误日志 线程 崩溃 com
  • 人行横道的应用程序大小增加了 71mb

    我真的希望我做错了什么 我已将人行横道添加到项目中 并且应用程序大小明显增加 为了测试我做了以下事情 创建了一个新的离子项目 将我的应用程序代码添加到 www 添加了 ngcordova 和各种插件 运行 ionic 构建并将 apk 放到
  • 如何使用 PowerShell 提取 Epub 元数据 (XML)?

    我对 PowerShell 并不陌生 但对 XML 解析很熟悉 基本上我想从 OPF 文件中提取标题 创建者和发布者信息 该文件只是一个 xml 文件 下面这本书是来自 Google 的 epub v3 样本集的 Moby Dick
  • 基于颜色的 OpenCV 边缘/边框检测

    我对 OpenCV 还很陌生 很高兴能了解更多信息 我一直在考虑勾画边缘和形状的想法 我遇到过这段代码 在 iOS 设备上运行 它使用了 Canny 我希望能够以颜色呈现它 并圈出每个形状 有人能指出我正确的方向吗 Thanks IplIm
  • Spring REST 和 PATCH 方法

    我正在使用 SpringBoot 和 Spring REST 我想了解 HTTP PATCH 方法来更新我的模型的属性 有没有好的教程解释如何使其发挥作用 HTTP PATCH 方法和要发送的正文 控制器方法以及如何管理更新操作 我注意到许