亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

REST API 部分匹配模式 - 對象具有多對多和一對多關系

REST API 部分匹配模式 - 對象具有多對多和一對多關系

天涯盡頭無女友 2023-01-05 17:10:39
我有一個像這樣的有點復雜的域對象:public class User implements Serializable {    private Long id;    private String firstName;    private String lastName;    private Boolean isActive;    private List<Company> comapnies;    private List<Department> departments;    private List<Responsibility> responsibilities;    private List<ContactInformation> contactInformation;}我想在我的 API 中有一個端點,允許更新任何這些屬性——我可以添加一個部門、一個職責、刪除一個公司等。由于網絡延遲,我不想每次都進行完整的對象更新。所以我想做一個部分更新(PATCH)現在,我有一個名為“UpdateUser”的自定義數據對象,該對象如下所示:public class UpdateUser implements Serializable {    private User user;    private List<Company> comapnies_to_add;    private List<Company> comapnies_to_remove;    private List<Department> departments_to_add;    private List<Department> departments_to_remove;    private List<Responsibility> responsibilities_to_add;    private List<Responsibility> responsibilities_to_remove;    private List<ContactInformation> contactInformation_to_add;    private List<ContactInformation> contactInformation_to_remove;}然后終點將基本上模塊化這些操作中的每一個(如果 responsibilities_to_add.length > 0,處理責任的添加)。我的問題與模式更相關——我覺得這是“hacky”。我希望有一種方法可以只對 User 對象使用部分更新,而不是使用帶有自定義 UpdateUser 對象的自定義端點。有沒有一種更簡潔的方法來處理包括一對多關系、多對多關系等的部分更新?我正在使用 Spring REST API 庫 + Java,以防有幫助。編輯我想這部分也很重要——我可以輕松地將刪除/添加對象的責任委托給用戶中的每個集合到不同的端點(我實際上已經有了),但我想要應用程序的單一端點,所以我們可以以交易方式處理一切。
查看完整描述

2 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

有沒有一種更簡潔的方法來處理包括一對多關系、多對多關系等的部分更新?

很難說——這取決于工作的哪一部分給你帶來了麻煩。

PATCH,并且類似地PUT,表達文檔編輯語義——在這兩種情況下,我們都要求服務器使其對某些資源的表示與客戶端的表示相匹配。

GET /foo和你依次發給我一個 1GB 的 json 文檔。我將該文檔加載到我的 json 編輯器中,并修復一兩個拼寫錯誤。因為變化很小,我可能想向您發送一個 PATCH 請求,而不是發回 1GB 的 json。這意味著我將在您和我理解的某種媒體類型中創建我的編輯的表示,并將該表示發送給您。

application/json-patch+json可能是一個很好的起點。

使用標準的好處在于,很多工作已經為您完成。但是您可以設計自己的補丁文檔模式,如果您愿意的話,并發布它,任何理解您的模式的客戶都可以與您進行互操作。

請注意,這一切都發生在“通過網絡傳輸文檔”的領域。這里沒有任何事情暗示客戶知道存在對象模型、關系數據庫表或任何類似的實現細節。這純粹是服務器要解決的問題。

當然,現在問題的第二部分是:我在這,一臺帶有補丁文檔的服務器和我的關系數據庫中可能需要更新的 110 個表。這是怎么發生的?正如約翰指出的那樣,這是必須實施的工作。在 Java/Spring/Hibernate 類型的世界中,一個可能的答案是您可以通過 ORM 加載當前服務器端狀態,使用補丁引導對本地內存數據結構的編輯,然后讓您的 ORM 找出什么需要運行語句。


查看完整回答
反對 回復 2023-01-05
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

我以前用兩種方式解決過這個問題。

  1. 就像你提到的。擁有處理邏輯和路由到適當的 crud 存儲庫方法的委托

  2. 使用 PATCH HTTP 方法。請注意,這只是語義上的。實際邏輯仍然需要像任何其他 HTTP 方法一樣由您完成。

此處示例:https ://github.com/jersey/jersey/tree/master/examples/http-patch


查看完整回答
反對 回復 2023-01-05
  • 2 回答
  • 0 關注
  • 153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號