我正在設計我的第一個 REST-API,并且正在努力為具有嵌套物件的 Cart 聚合設計 API:
購物車 1->n 子購物車 1->n CartItem。
購物車聚合作為一個整體保存。每次將商品放入購物車時,必須計算各種折扣,這些折扣取決于其他 CartItem,甚至來自其他 SubCart。因此,客戶端應用程式需要接收包含所有嵌套物件的完整 Cart 聚合。
Evens 在他的 DDD 書中說:“......根是 AGGREGATE 中唯一允許外部物件持有對......的參考的成員”。
大體的思路我明白,但不清楚參考是什么意思。一些文章談論記憶體物件參考,其他文章也談論 id 參考。如果用戶 ie 想要增加 CartItem 的數量,UI 必須有一種方法來識別購物車中的專案。它需要有一些 id/reference。否則購物車怎么知道應該增加什么物品的數量。埃文斯提到的意思是什么?它的措辭方式非常令人困惑。
由于所有命令都通過后端的 Cart 聚合,我想知道這是否也應該應用于 REST API。由于我缺乏經驗,我不知道一種或另一種解決方案會產生什么問題或副作用(即快取、安全性)?為什么會偏愛其中一種?
例如,為了更新 CartItem 的數量,我看到了以下選項:
PATCH 購物車/{id}/subcarts/{subcart_id}/cartitems/{cartitem_id}
PATCH 購物車/{id}/{subcart_id}/{cartitem_id}
PATCH /carts/{id}?subcart={subcart_id}&cartitem={cartitem_id}
PATCH 購物車/{id} 在正文中具有 subcart_id 和 cartitem_id
我看到 GIT API 在某些情況下使用了選項 2 的較短形式。什么時候應該選擇選項 1 而不是選項 2?
對于選項 3 和 4,很自然地回傳新的 Cart 物件,并且由于 PATCH 可能有折扣。
對于選項 1 和 2,在 CartItem 的 PATCH 之后回傳 Cart 物件似乎不是 RESTful。回傳可能是 204,然后客戶端必須再次在 Cart 上發送 GET,從而導致兩次呼叫。
感謝您的任何幫助和見解。
uj5u.com熱心網友回復:
我的建議是盡可能讓它簡單易懂。
首先,REST 指南是約定,而不是一成不變的規則。另外,你說你害怕不是 RESTful。我幾乎可以肯定,無論如何你都不會這樣:-)。例如,我幾乎可以肯定你根本不會實施HATEOAS,沒有它你就不會創建一個 RESTful 系統(就像你發現的絕大多數所謂的 REST API 一樣,畢竟 :-))
也就是說,您應該考慮要對它們執行的資源和 CRUD 操作。由于折扣取決于子購物車中是否存在其他商品,我的建議是將購物車視為您的資源,包括其子購物車和商品。這簡化了您的作業和對系統的整體理解。
根據性能和清晰度問題做出決定。
uj5u.com熱心網友回復:
甚至它背后的想法對我來說都很清楚,但不清楚參考是什么意思。有些文章談到記憶體中的物件參考,其他文章也談到 id 參考。如果用戶 ie 想要增加專案的數量,則 UI 必須具有該專案的 ID/參考。埃文斯提到的意思是什么?
指標。
class A {
B b
}
在這個例子中,A“持有對 B 的參考”。根據 Evan 的指導方針,如果 A 和 B 都是域物體,那么 B 的這個實體是與 A 的這個實體相同的 AGGREGATE 的成員,或者B 本身就是其 AGGREGATE 的根物體。
如何為嵌套物件的聚合設計 REST API?
REST API 是資源的集合,其中資源可以理解為“網頁”的概括。客戶端發送訊息來操作資源,有用的業務活動是操作資源的副作用。見韋伯,2011 年。
換句話說,客戶端向 HTTP 服務器發送 PATCH/POST/PUT 訊息,服務器依次呼叫相應聚合根物體上的一些命令。
PATCH /carts/{id}/subcarts/{subcart_id}/cartitems/{cartitem_id}
PATCH /carts/{id}/{subcart_id}/{cartitem_id}
PATCH /carts/{id}?subcart={subcart_id}&cartitem={cartitem_id}
PATCH /carts/{id}
所有這些都很好,因為您可以擁有盡可能多的不同資源來更改相同的聚合根,并且您可以為資源識別符號使用任何您喜歡的拼寫約定。這里唯一真正的限制是識別符號應該符合 RFC 3986。
注意:在更改后保持所有客戶端本地快取的不同資源副本同步可能很棘手;因此,如果您不確定自己知道自己在做什么,那么我的建議是每個聚合擁有一個資源。
可以使用 POST,您可能會發現使用 POST將域模型命令的表示發送到服務器使實作比嘗試從補丁檔案計算命令更容易。請記住,Web 使用 HTML 表單和 POST 取得了災難性的成功。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/374050.html
上一篇:如何向“/users?<some-query-here>”發出GET請求,然后所有滿足查詢條件的用戶都以JSON陣列形式回傳
