2016-12-01 99 views
0

有此MongoBean:SuperBean偏字段更新REST API

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实现接受一个Map。实际的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) {} 
    

哪些因素应该考虑到这些选择的方法之一?有没有更好的方法来解决这个问题?

回答

1

在我的项目,我们通常选择类似与你的第二个方式方法。但不完全一样。

例如,在您的客户端,你有一个网页或修改您的个人资料信息视图,包括namebirthdaygender,虽然你只是修改name值,当你点击save按钮,它仍然会发数据到服务器包括birthdaygendername字段,但只是保持其旧值。并且服务器API将直接更新数据库中的这三个值,不会检查其值是否更改。

如果您有另一个页面或视图修改档的其他

,喜欢的密码,它需要添加在客户端的新方法,并在服务器的新API。 API URL喜欢PATCH /reset_password,发送的数据应包括old_passwordnew_password字段。

PS:
1.我们用PUTPATCH更新的资源,而不是POSTPOST用于创建一个新的资源。 2.当你更新资源,在上面的例子中,API喜欢PATCH /profiles/:id(其他的配置文件)或PATCH /profile(你自己个人资料),所以发送的数据不需要id场了,它包括在你的API URL。