我想圍繞如何設計一個RESTful API來創建對象圖形。例如,考慮一個電子商務API,在資源有以下關係:RESTful創建對象圖形
訂單(主要對象)
- 具有一對多的地址
- 具有一對多的訂單行項目(哪些呢訂單包括)
- 具有一對多的付款
- 具有一對多的聯繫方式
訂單資源通常與其關聯一起有意義。孤立地說,它只是一個沒有商業意義的笨蛋容器。但是,每個關聯對象都有自己的生命,可能需要獨立操作,例如。編輯訂單的送貨地址,改變對一個訂單的聯繫人信息,後從訂單刪除線項目已放置等
有兩個選項用於設計API:
- 的訂單API端點智能地發送到
POST /orders
- 的訂單資源只創建本身和客戶端必須進行後續POST請求到新創建的端點內容處理「嵌套資源」創建本身及其相關資源,如
POST /orders/123/addresses
,PUT /orders/123/line-items/987
,e tc
雖然第二個選項更容易在服務器端實現,但它使客戶端爲80%的用例做了額外的工作。
第一個選項有以下開放式問題:
- 一個人如何溝通,爲新創建資源的網址是什麼?
Location
標題只能傳遞一個URL,但服務器可能會創建多個資源。 - 如何處理錯誤?如果其中一個關聯有錯誤會怎麼樣?我們拒絕整個對象圖嗎?這個錯誤如何傳達給客戶?
什麼是RESTful +務實的方式來處理這個問題?
「通常有意義」意味着訂單*可以*在沒有其他資源的情況下存在嗎?方案2的兩個步驟之間的資源是否處於無效狀態? – 2013-03-11 07:39:10
在創建訂單時,80%的關聯數據可用。但是,在20%的情況下,我們*可能*想要在DB中存儲部分對象以在稍後階段更新和處理。例如,我們可能想要跳過付款信息並稍後添加。 – 2013-03-11 07:50:00