2011-05-07 19 views
1

我正在使用REST服務器。我有一個訂單資源。如何在REST請求中應用PUT動詞?

根據我的理解,PUT動詞應根據URL創建新的訂單。我的問題是:如果資源是新的,並且您不知道新訂單的ID,它將如何工作?

我知道POST VS把辯論,但我引述W3規格爲PUT http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

「如果Request-URI沒有指向已存在的資源,而URI是能夠被定義如該請求的用戶代理一個新的資源,原始服務器可以創建與URI」

+1

我認爲PUT通常是修改/替換,而POST是添加(並且不需要ID)。但我相信其他人將能夠提供更多細節。 – 2011-05-07 19:02:25

+0

如果您不知道該ID(因此也不知道該URI),則無法使用PUT。 – seairth 2011-05-07 19:17:01

+0

另外,這個問題與C#或php沒有密切關係。請妥善保管。 – seairth 2011-05-07 19:19:00

回答

6

在RESTful API中,PUT資源通常用於更新資源或創建一個,如果它不存在在指定的URL(即客戶端提供的ID)。如果服務器生成該標識,則RESTful API通常使用POST來創建新資源。在後一種情況下,生成的id/url通常會在重定向中返回或指定。

例子:POST /orders/

+1

如果一個POST創建一個新資源,它應該返回一個HTTP 201創建響應。 – seairth 2011-05-07 19:13:57

+0

@seairth對。或者在異步情況下使用HTTP 202,或者出現問題時使用適當的錯誤代碼。 – 2011-05-07 19:19:39

0

你說,「不知道新訂單的ID」因此以下是不正確的「URI是能夠被定義爲請求的用戶代理的新資源」,因此PUT在您的方案中不適用。

混淆在哪裏?我當然假設Id將成爲URL的一部分。

1

簡而言之,POST用於創建,PUT用於更新。如果您沒有對象的ID,因爲它尚未創建,您應該使用POST。如果一個對象存在,並且你只是沒有它的ID,你將不得不使用某種類型的GET進行搜索。

要記住的是Idempotence。 A PUT(和GET就此而言)是冪等的。基本上來說,你可以一遍又一遍地找到相同的URL,第二次或第三次(它編輯數據一次,再次調用它不會再做這個改變)應該沒有什麼不同。然而POST而不是冪等。這意味着,你連續3次或4次訪問同一個URL,它將不斷更改數據(創建越來越多的對象)。這就是爲什麼如果您點擊返回POST網址,瀏覽器會發出警告。

2

根據W3CPUTPOST都可用於更新和/或創建。 它們之間的基本區別在於服務器如何處理Request-URIPUT URI標識實體,服務器不應嘗試將其映射到另一個URL,而URI可以是該內容的處理程序。例如:

沒關係POST新訂單到/order,但不是PUT。您可以使用PUTPOST更新訂單1至/order/1

+0

原始問題的答案很好。 – Pih 2011-05-07 19:37:44