2014-10-06 38 views
0

我的應用程序交易要求用戶註冊才能使用該服務,並且要他們創建應用程序。接口的初始計劃如下...Rest API需要額外的操作 - 如何構造?

POST /Users/Applications - 創建應用程序並返回唯一標識符。

GET /Users/Applications/{id} - 檢索現有的應用程序。

PUT /Users/Applications/{id} - 更新現有的應用程序。

DELETE /Users/Applications/{id} - 刪除現有的應用程序。

這看起來非常乾淨合理,並且充分利用了HTTP動詞。不過,如果我現在需要在應用程序上進行其他操作,例如

  • ActivateApplication - 一旦所有的數據都在系統中使用PUT我現在希望用戶激活他們的應用程序。這不僅僅是使用PUT更新應用程序狀態的問題,還需要完成幾項額外的工作來激活應用程序,例如向HR部門發送電子郵件。通知他們新的申請已經到達。

  • PrintApplication - 當從客戶端調用時,將應用程序打印到辦公室打印機。 (不是一個理想的例子,但你的想法,我敢肯定!)

我將如何構建我的REST接口來處理這種類型的請求?也許這樣...

POST /Users/Applications/{id}/print 

POST /Users/Applications/{id}/activate 

...爲激活我改變狀態,所以我相信我需要使用POST。我知道REST是關於文檔的,但是當我需要對文檔執行操作時,如何構造我的API,而不僅僅是獲取和更新文檔本身?

+1

對於激活,你有沒有考慮過賬到/用戶/應用/ {ID}有例如IsActivated屬性設置爲true,更新的應用程序資源?然後,您可能需要在屬性更改時處理事件,以便觸發發送電子郵件等流程。 – elolos 2014-10-06 13:16:33

回答

2

This Martin Fowler的文章指出: 有些人錯誤地在POST/PUT和創建/更新之間建立了對應關係。他們之間的選擇是相當不同的。

當我嘗試PUT和POST我遵循一條規則之間作出選擇:

PUT - >冪等

POST - >不是冪

冪等的意味着沒有執行一個和多個操作之間的區別。在第一次操作之後以及在其他每次操作之後,DB數據將相同。

在非冪等運算的情況下,每個執行的操作都會更改數據庫中的數據。

這就是爲什麼PUT通常用於UPDATE操作和POST用於CREATE的原因。但這不是正確的規則。

正在添加回到你的問題,在我看來,你正在使用的POST正確的不冪等動作,因爲ActivateApplication多次調用會發送多封電子郵件。

編輯

由於@elolos曾這樣評價,繼單一責任原則,發送電子郵件應該是另一種責任沒有直接聯繫的更新狀態。當屬性,以便觸發像發送電子郵件過程將是一個更好的辦法改變處理事件。這樣ActivateApplication操作可以是冪等的,並使用PUT HTTP方法被調用。

+0

我同意PUT/POST比較。我不知道,允許多次啓用好德興不過,將垃圾郵件與同激活的多個副本HR部門是否可以接受? – elolos 2014-10-06 13:21:09

+0

@elolos你說得對。我按照你的方法編輯了我的答案。 – 2014-10-07 09:59:16