2013-03-11 87 views
1

我想圍繞如何設計一個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 +務實的方式來處理這個問題?

+0

「通常有意義」意味着訂單*可以*在沒有其他資源的情況下存在嗎?方案2的兩個步驟之間的資源是否處於無效狀態? – 2013-03-11 07:39:10

+0

在創建訂單時,80%的關聯數據可用。但是,在20%的情況下,我們*可能*想要在DB中存儲部分對象以在稍後階段更新和處理。例如,我們可能想要跳過付款信息並稍後添加。 – 2013-03-11 07:50:00

回答

0

這兩個選項都可以實現RESTful。你問:

如何溝通新創建的資源的URL? Location標題只能傳遞一個URL,但服務器可能會創建多個資源。

就可以這樣做,你在GET情況溝通links s到其他資源的方式相同。使用link元素或者您的方法將資源的URL嵌入到表示形式中。

1

我如何處理這是第一種方法。您不應該假定客戶會提出所有需要的請求。在一個請求上創建所有實體。

根據您的使用情況,您可能還希望在創建實體時實施「全有或全無」方法;即,如果某件事情下降,一切都會回滾。你可以通過在你的數據庫上使用一個事務來做到這一點(如果所有事情都是通過不同的請求完成的,你也不能這樣做)。確定這是否是您想要的行爲對您的情況非常具體。例如,如果您正在創建一個訂單聲明,您可以使用此命令(您不想創建缺少項目的訂單),但是如果您上傳照片,它可能沒有問題。

爲了返回鏈接到客戶端,我總是返回一個JSON對象。您可以使用指向每個創建資源的鏈接輕鬆填充此對象。通過這種方式,客戶可以確定在成功發佈後如何表現。

+0

有數據庫事務的好處在那裏,但是傳遞錯誤消息增加了複雜性。在對象圖的特定對象中傳遞錯誤消息的RESTful方法是什麼? – 2013-03-12 08:46:46

+0

只要你記錄你的API的行爲如何,它取決於你。也許在我提到的響應JSON對象中包含錯誤信息而不是鏈接? – 2013-03-12 16:23:27

+0

在RESTful API中是否存在返回錯誤的事實標準/約定?特別是當創建一個對象圖失敗時? – 2013-03-13 05:17:12