2012-02-13 143 views
30

我正在閱讀一些關於如何正確使用URI的使用rest服務的文檔,並且我遇到了基本GET .. DELETE請求的示例。在URI中包含用於PUT請求的Id

的例子URI的是:

獲取所有用戶

GET http://mydomain.org/api/users 

獲取特定用戶

GET http://mydomain.org/api/users/1 

更新用戶

PUT http://mydomain.org/api/users/1 

刪除用戶

DELETE http://mydomain.org/api/users/1 

用戶資源是JSON或XML的形式:

{ 
    Id: 1, 
    FirstName: 'John', 
    LastName: 'Doe' 
} 

我的問題是這樣的。爲了維護REST原則,是否需要在URI的PUT請求中包含資源的ID?

回答

33

PUT方法要求封閉的實體存儲在提供的Request-URI下。

你想PUT一個資源到你打算從GET它相同的URI。

RFC 2616 9.6 PUT

+0

這很有道理。我的假設是ID始終會與資源一起提供,但我想這並不總是如此。 – 2012-02-13 19:23:34

+1

事實上,如果您在界面中開始使用URI,那麼您可能會很快發現從資源表示中刪除該ID很有用。 – fumanchu 2012-02-14 01:21:51

+2

RFC-2616被[RFC-7231]廢棄(https://tools.ietf.org/html/rfc7231#section-4.3) – prasanthv 2015-06-02 17:34:37

13

我要問過類似的問題,但我想我找到了答案。我不確定它是否通過REST原則,但這是爲什麼不在URI中包含ID很不好。 所以說你PUT是這樣的:

PUT http://mydomain.org/api/users 

然後你碰巧更新多個用戶以不同的ID,但相同的URI原因在你的URI沒有ID。那麼,這裏要知道的重要一點是PUT是冪等http動詞。這意味着一次調用它應該具有與多次調用相同的效果。因此,網絡中的一些中間節點,只要您多次執行PUT,可能會忽略所有請求,因爲它們具有相同的URI。最後,這絕不是你想要的,因爲其意圖是不僅更新多個用戶。

+2

我懷疑這是可能的,因爲身體會有所不同。即使你正在更新相同的資源,你可能會有不同的更新(使用不同的值),忽略其中的一些是一個非常意外的行爲。 – falconizer 2016-09-15 08:11:52

+0

冪等動詞應該具有相同的效果,無論它被調用多少次。這是標準要求的。 – 2017-03-23 22:01:24

+0

關於這個問題,只有當請求完全相同時,這纔是真實的。假設我們有兩個請求'PUT:/ api/users/1',它們的主體是'{「name」:「Foo」}'和'{「name」:「Bar」}'。 冪等並不意味着第二個請求會被忽略,對吧?這只是意味着執行完全相同的請求將具有與僅執行一次相同的效果。 – 2017-04-20 09:23:54