java - 部分字段更新 REST API

标签 java rest updates crud spring-mongo

有这个MongoBean:SuperBean

class SuperBean extends MongoBaseBean{
     private String id;
     private String title;
     private String parent;

     //And getters, setters   
}

需要编写一个更新API,能够执行部分属性更新。在网络上看到以及从我的同行那里听到的常见方法是检查请求中的字段是否为空,如果不为空则更新。但如果更新请求是将值更新为Null呢?

经过几次讨论,我们提出了三种方法:

  • 设置 bean 中字段的默认值。因此,如果请求中没有 $,则将考虑更新,而不是非空父字段。

    class SuperBean extends MongoBaseBean{
     private String id;
     private String title;
     private String parent = "$";
    
     //And getters, setters   
    }
    
  • 让更新 API 实现接受映射。实际的 bean 被获取,并且请求映射中存在的所有字段都将被更新。

    @Post
    public SuperBean updatePartial(Map<String,Object> dataObject) {}
    
  • 让更新 API 接受包含 2 个映射的 DTO。一个包含旧值,另一个包含新值。这在仅当数据库包含 oldDataObj 中发送的值时才必须进行更新的情况下可能是有利的。但这会增加有效负载的大小。

      class SuperBeanUpdateDTO {
         private Map<String, Object> oldDataObj;
         private Map<String, Object> newDataObject;
         //getters, setters
      }
    
      @Post
      public SuperBean updatePartial(SuperBeanUpdateDTO updateDTO) {}
    

选择这些方法之一应考虑哪些因素?还有其他更好的方法来解决这个问题吗?

最佳答案

在我的项目中,我们通常选择与您的第二种方式类似的方式。但并不完全相同。

例如,在您的客户端,您有一个页面或 View 来修改您的个人资料信息,包括姓名生日性别,虽然你只是修改了name值,但是当你点击save按钮时,它仍然会将数据发送到服务器,包括birthdaygendername 字段,但只需将其值保留为旧值。服务器API会直接更新数据库中的这三个值,不会检查其值是否改变。

如果您有另一个页面或 View 来修改配置文件的其他部分,例如密码,则需要在客户端中添加新方法并在服务器中添加新API。 API URL 类似于 PATCH/reset_password,发送的数据应包含 old_passwordnew_password 字段。

PS:
1.我们使用PUTPATCH来更新资源,而不是POSTPOST用于创建新资源资源。 2. 当您更新资源时,在上面的示例中,API 类似于 PATCH/profiles/:id (其他人的个人资料)或 PATCH/profile (您自己的个人资料),因此发送的数据不再需要 id 字段,它包含在您的 API URL 中。

关于java - 部分字段更新 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40917314/

相关文章:

python - Django REST Framework 中的驼峰式 POST 数据

c# - 使用 HttpClient 将 Content-Type 设置为 "application/json"并将对象添加到正文

java - 字符串变量的资源注入(inject)返回null

java - 是否jsp :setProperty escape esc-sequences?

java - 无法使用 Spring、Hibernate 和 c3p0 创建 dataSource bin

node.js - 特定航线特殊 Passport 认证

ios - 如何在 iOS 企业发行版期间自定义对话框文本

c# - Unity 5.5 废弃的粒子系统代码

android - 更新后打开我的android程序

java - 有什么办法可以找到循环引用吗?