2013-01-10 73 views
0

我想弄清楚使用REST約定進行更新的正確方法。到目前爲止,我們有:REST PUT網址約定

更新單個項目:

PUT 
https://mydomain.com/dogs/{id} accept: application/json, {dog} 

更新多個項目:

PUT 
https://mydomain.com/dogs accept: application/json, [{dog1}, {dog2}, ...] 

我想如果約定也決定弄清楚(除,或者什麼,而不是我們上面有),這對於一個項目:

PUT 
https://mydomain.com/dogs accept: application/json, {dog} 

然後,後續問題:說一個元素具有我們更新集合時出現驗證錯誤。公約是否規定我們返回422並拒絕整個請求?或者我們更新有效的並返回4xx狀態碼?

+0

在你的第二個例子(列表)中,最好使用POST。 POST是「附加」動詞,並且您將兩個項目追加到狗列表中。 PUT的意思是「這是整個狗的集合!」。 ...第三個例子的問題是你不知道這隻狗有什麼{id}!這不是狗收集的代表!所以你最好使用(1)或者在(3)中再次使用POST。 POST更常見於創建。 ...你如何返回驗證錯誤完全取決於你 - 我不知道有明確的約定。我可能會拒絕整個事情恕我直言。 – Rob

回答

2

PUT通常用於更新,但PUT並不意味着更新。 PUT背後的基本思想是您將資源置於特定位置。您的第一個代碼段是準確的,因爲您正在該位置放置該資源的新版本。

然而,以下兩個請求不堅持PUT的語義:

PUT 
https://mydomain.com/dogs accept: application/json, [{dog1}, {dog2}, ...] 

PUT 
https://mydomain.com/dogs accept: application/json, {dog} 

一般來說,我會要求那些要求我的API執行多個PUT請求,可以並行完成,更新多資源。但是,如果有必要,同時更新多個資源,我會考慮使用POST,如:

POST 
https://mydomain.com/dogs/update-many accept: application/json, [{dog1}, ...] 

至於錯誤的情況下,將最好是通過文檔處理。我覺得要麼拒絕整個請求,要麼回滾,要麼返回包含每個發送實體的標識符/成功狀態的響應,只要用戶知道該行爲即可。一般來說,我認爲答覆與請求直接相關,而不是請求中的每個項目;因此,如果請求的任何部分失敗,我會返回一個錯誤代碼和解釋。我認爲用戶總是期望2XX代碼在假設任何請求具有持久影響時更簡單。