2013-06-27 15 views
3

我們正在設計一個需要支持多種登錄服務的RESTFUL API。RESTFUL中的幾個登錄API

Custom login: ptgapi/v1/clients/{clientId}/users?mode=custom 
FB login:  ptgapi/v1/clients/{clientId}/users?mode=facebook 
Twitter login: ptgapi/v1/clients/{clientId}/users?mode=twitter 
LinkedIn login: ptgapi/v1/clients/{clientId}/users?mode=linkedin 
Create user: ptgapi/v1/clients/{clientId}/users 

我們在服務之上有一個Spring集成層,所以在提供的路徑的基礎上,需要激活其中一個服務。

這個想法是有一個路由器捕獲入站網關輸入,並根據有效負載值重定向流。

<int-http:inbound-gateway id="v1.login.inbound.gateway" path="/ptgapi/{apiVersion}/clients/{clientId}/users" .../> 

但是這裏'創建用戶'具有相同的路由過程比其他的...我認爲這是一種難聞的氣味。

是否有更好的方法來獲得更好的關注點?

謝謝!

回答

1

服務可能具有相同的路徑/路由,但它們由操作標識。在REST中,您將擁有相同的服務路徑,但取決於您正在執行的操作類型,HTTP方法將有所不同。您可以通過使用POST和PUT HTTP方法區分登錄和創建服務。

個人來講,我相信PUT是一個更好的選擇,因爲PUT提供了更多的控制,例如:

  • 你命名你的URL對象創建明確,或讓服務器決定?如果你命名他們,然後使用PUT。如果你讓服務器決定然後使用POST。
  • PUT是冪等的,所以如果你把一個對象放兩次,它就沒有效果。這是一個很好的屬性,所以我會盡可能使用PUT。
  • 您可以更新或創建資源與同一對象的URL

更多關於PUT與POST

PUT意味着把一個資源PUT - 完全取代一切可在給定的URL與一個不同的東西。根據定義,PUT是冪等的。隨心所欲地做多次,結果是一樣的。 x = 5是冪等的。無論以前是否存在資源(例如創建或更新),您都可以放入資源!

POST更新資源,添加輔助資源或導致更改。 POST不是冪等的,因爲x ++不是冪等的。

+0

你的意思是在登錄中使用PUT(因爲令牌被修改)並且在創建時使用POST? –

+0

@antacerod不,我在想另一種方式。 PUT創建實體和POST登錄。我分享幾個SO鏈接來支持:-) –

+0

好的。我明白你的觀點......我對關於REST的概念錯了。我會按照你的意見。謝謝你,很好的回答! –

0

創建用戶的動作,所以也許你可以這樣定義

Create user: ptgapi/v1/clients/{clientId}/users/new 

或類似這樣的東西了新的途徑。

+0

我有這個想法,但從嚴格的restify的角度來看,創建新用戶的操作必須是我在帖子中告訴的操作...您不覺得問題更多地與登錄相關嗎路徑而不是創建用戶? –

+0

對於此設計,我遵循以下鏈接:http://stackoverflow.com/questions/4608225/how-do-i-implement-login-in-a-restful-web-service –

+0

簡單的問題:「創建用戶「是爲特定的服務創建一個用戶還是一個通用的(針對指定的客戶端)? – Enrichman

1

對於你應該有一個像ptgapi/V1 /客戶/ {的clientId} /用戶並使用HTTP方法的路線,因爲他們都應該給用戶CRUD:GET返回用戶, PUT用於創建用戶,POST用於更新用戶和DELETE將其刪除。

登錄操作本身不是用戶實體操作。你應該有另一條路線,就像ptgapi/v1/clients/login並通過POST傳遞登錄參數(最好加密)。

+0

謝謝亞歷山大。這是區分登錄和創建的好選擇。我會牢記它! –

+1

REST身份驗證是一個公開辯論。沒有書面的最佳實踐。記在心上。 –