![](/img/trans.png)
[英]Patch REST API to Partial Update MongoDB in spring boot
[英]Partial fields update REST API
有這個MongoBean:SuperBean
class SuperBean extends MongoBaseBean{
private String id;
private String title;
private String parent;
//And getters, setters
}
需要編寫一個更新API,該API能夠執行部分屬性更新。 在網絡上以及從我的同齡人那里聽到的常見方法是檢查Null請求中的字段,如果不為null,則進行更新。 但是,如果更新請求將值更新為Null,該怎么辦?
經過少量討論,我們提出了三種方法:
為Bean中的字段設置默認值。 因此,如果它在請求中沒有$而不是非null父字段,則將考慮對其進行更新。
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) {}
選擇這些方法之一應考慮哪些因素? 有沒有更好的方法來解決此問題?
在我的項目中,我們通常選擇與第二種方式相似的方式。 但不完全相同。
例如,在客戶端,您有一個頁面或一個視圖來修改您的個人資料信息,包括name
, birthday
, gender
,盡管您只是修改了name
值,但是當您單擊save
按鈕時,它仍然會將數據發送到服務器包括“ birthday
和“帶有name
gender
字段,但只需保持其舊值即可。 服務器API將直接更新數據庫中的這三個值,而不檢查其值是否更改。
如果您有另一個頁面或視圖來修改配置文件的其他部分(例如密碼),則需要在客戶端中添加新方法,在服務器中添加新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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.