2016-12-01 101 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。