有这个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
按钮时,它仍然会将数据发送到服务器,包括birthday
和gender
与 name
字段,但只需将其值保留为旧值。服务器API会直接更新数据库中的这三个值,不会检查其值是否改变。
如果您有另一个页面或 View 来修改配置文件的其他部分,例如密码,则需要在客户端中添加新方法并在服务器中添加新API。 API URL 类似于 PATCH/reset_password
,发送的数据应包含 old_password
和 new_password
字段。
PS:
1.我们使用PUT
或PATCH
来更新资源,而不是POST
,POST
用于创建新资源资源。
2. 当您更新资源时,在上面的示例中,API 类似于 PATCH/profiles/:id
(其他人的个人资料)或 PATCH/profile
(您自己的个人资料),因此发送的数据不再需要 id
字段,它包含在您的 API URL 中。
关于java - 部分字段更新 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40917314/