2012-03-11 331 views
3

我搜遍了很多,但我找不到有關我的條件的問題的正確答案。
我正在構建一個REST API,並且這種情況對我來說似乎是一個邊界線案例,如下所示:

- 我正在處理兩個實體 - 用戶和角色。用戶可以分配多個角色。
- 要將角色分配給用戶,該角色必須已經存在於數據庫中。
- 要爲用戶分配角色,唯一需要的是角色的「代碼」,即短字符串。現在用
-The URI路徑模板是:
--users:本地主機:8080/API /用戶
--Given用戶:本地主機:8080/API /用戶/ {用戶id}
給定的--Roles用戶:localhost:8080/api/users/{userId}/roles

現在,爲了'連接'給定的用戶和給定的角色,我想到了兩個選項。
- 第一種是在任何情況下聽起來都是最佳實踐的方式,可以將發佈數據發送到正文中,可能是JSON。
- 另一個,通過uri和一個空的身體發送它。例如,要將具有ID爲U001的用戶與角色R001相鏈接,則必須發佈到以下uri,而不在身體內發送任何數據:localhost:8080/api/users/U001/roles/R001

事情是這樣的我不介意使用第一個選項,它似乎是最好和最正確的一個,但在這種特殊情況下,我不確定發送一個幾乎空的身體會更好(因爲它只是扮演角色id,一個非常短的字符串)將其發佈到'localhost:8080/api/users/U001/roles'或跳過主體並僅通過uri發送角色id作爲路徑參數,例如localhost:8080/api/users/U001/roles/R001
如何爲HTTP POST使用URI路徑變量?

非常感謝大家的幫助。

回答

3

將角色放在URI中沒有任何問題。你的直覺是正確的。我會這樣做。

PUT:的locahost:8080/API /用戶/ {用戶ID} /角色/ {}角色ID

這裏的原因。

第一:PUT動詞是冪等性。換句話說(直接從規格中獲取)

...... N> 0個相同請求的副作用與單個請求相同。

這就是我想在這方面想要的。您不希望您的狀態存儲中的多個記錄用於每個用戶&角色的實例。用戶應該輕鬆地做出相同的PUT請求,而不會對系統產生不利影響(添加重複記錄)。

當用POST做同樣的事情時,我希望爲每個請求創建一個新記錄。

第二:PUT動詞應該標識特定的資源。 (直接從規範中獲取)

... PUT請求標識隨請求附帶的實體 - 用戶代理知道URI的用途,服務器不得嘗試將請求應用於其他資源。如果服務器希望將請求應用於不同的URI,則它必須發送301(永久移動)響應;用戶代理可以自行決定是否重定向請求。

如果角色R102變得過時並且R104更受歡迎會怎麼樣?用HEADER(位置:localhost:8080/api/users/{userid}/role/R104)返回301(永久移動)。

最後:當一切正常時。在創建時返回一個201(創建),並在每個後續請求中返回一個200(無內容)給同一個URI。如果他們提供不在系統中的角色,則返回501(未實施)。

0

嗯 - 在這種情況下 - 與302的POST可能有點混亂。

爲什麼不是一個非常簡單的'PUT'/'DELETE'的確提供了URI?

用簡單; 20X意思是成功的,可能有30X表示它已經在那裏了 - 還有其他的一切都失敗了?