2012-03-13 67 views
0

在我的資源模型中,我有一個「訂閱」資源。它會經歷生命週期狀態,如「取消訂閱」 - >「訂閱待處理」 - >「訂閱」 - >「取消訂閱待處理」 - >「取消訂閱」。發佈到控制器資源 - 控制器的ID是控制器URI還是POST參數的一部分?

爲了允許客戶訂閱或取消訂閱訂閱,我打算公開兩個控制器資源(稱爲「sub」和「unsub」)用於訂閱/取消訂閱訂閱,每個接受POST請求將同步放置目標訂閱資源轉換爲適當的「等待」狀態,並異步執行額外的工作以將訂閱置入「訂閱」或「未訂閱」狀態。

我可以想到幾種方法讓客戶端在向「sub」或「unsub」發出POST請求時指定目標訂閱。我可以把目標預訂ID爲URI,就像這樣:

/訂閱/ {subscription_id} /子 也許 /子/ {subscription_id}

[注:在URI露出訂閱ID不會出現安全問題,我的應用程序]

或者,我可以讓訂閱ID的POST參數去:

/子

思考哪種方法最好?如果你更喜歡URI方式,你更喜歡哪種URI風格,爲什麼?

注意:已取消訂閱的訂閱隨後可能會重新訂閱,因此「取消訂閱」操作不等同於刪除訂閱資源。

回答

0

我將ID作爲POST參數到/ subscription。

而不是有一個單獨/取消訂閱資源,我會發送一個DELETE請求/訂閱(以同樣的方式傳入ID)。

我選擇了訂閱而不是訂閱者,因爲訂閱者在創建/刪除訂閱或實際訂閱者/用戶方面存在歧義。

編輯 - 後澄清。

REST使用動詞GET,POST,PUT和DELETE。 GET在這裏沒有意義的創建/更新。你不想DELETE,因爲你想讓資源呆在裏面。所以我會建議做一個POST來創建/啓動一個訂閱和一個修改/取消訂閱訂閱的PUT。這是對PUT動詞的輕微誤用,但我認爲它比您的案例更適合您。

+0

感謝您的反饋意見。關於術語「訂戶」的含糊不清的好處;我會重新考慮這個名字。關於您的要點:對於我的應用程序,取消訂閱不是刪除 - 訂閱在理論上可以在未來重新訂閱。我沒有提到這個問題。我最初認爲要將「action = subscribe」或「action = unsubscribe」這樣的表單參數傳遞給訂閱資源,但從我讀到的內容來看,這相當於隧道,這讓人望而卻步。這就是我帶領兩個控制器資源的方向。 – 2012-03-13 18:18:08

+0

注意:我更新了原始問題以重命名控制器資源,並澄清取消訂閱!=刪除。 – 2012-03-14 12:45:54

+0

爲了響應您的編輯:在我的應用中,訂閱通過POST創建到訂閱集合。在預訂操作的訂閱資源上使用POST和取消訂閱操作的PUT似乎不一致;兩者的動詞似乎都是可取的。我使用PUT來更改訂閱的狀態(不包括生命週期狀態),例如改變名字。然而,我認爲訂閱/取消訂閱是作爲操作而不是狀態改變(儘管狀態受到影響),所以我傾向於POST,但是試圖避免隧道,因此控制器資源。 – 2012-03-14 16:53:06

0

爲了完整起見,我將根據進一步的研究和考慮給出另一個答案。最終,如果您遵循HATEOAS原則,除了頂級域名之外的URI對客戶端來說是非常不透明的,因此從客戶端的角度來看,控制者是否被識別並不重要控制器的URI或不。從服務的角度來看,作爲一個實用和唯美的問題,將其從控制器的URI中排除出去會使它更短更簡單,所以就是這樣。另一方面,在URI中公開受控者將允許中間人(例如,路由器或防火牆)更容易檢查並採取行動,在某些情況下可能有用。

對於我的項目,我最終決定在URI/subscription_tasks中公開一個控制器資源,接受包含動作(訂閱/取消訂閱)和目標訂閱ID的POST作爲POST有效內容中的表單參數。 POST返回一個subscription_task資源,該資源可以通過GET輪詢進行監視,直到任務完成。