2013-09-24 49 views
0

我有一個基於提供的身份驗證(登錄)提供帳戶資源的API。由於用戶只能擁有一個帳戶,並且只能看到自己的帳戶,而不能看到其他帳戶,所以這個API在所有情況下基本上都是單個資源API。擁有基於身份驗證的單個資源的RESTful方式

爲了簡單起見,我在accounts/的網址下有這個資源,當你訪問accounts/?username=dude&password=veryhard時,你會得到你的賬戶數據(如果你沒有提供認證,你將得到403)。

現在我想知道這是否是RESTful。此外,您應該能夠更新您的帳戶信息,並且我懷疑PUT是否合適。據我所知,PUT應該在資源的唯一URI上完成。那麼,這是資源的唯一URI嗎?通常,帳戶的URI看起來像accounts/3515/,其中3515是帳戶ID。但是,用戶不知道他們的賬戶ID。另外,應該有更多的登錄方式,而不是用戶名+密碼,您還應該可以使用令牌(如accounts/?token=d3r90jfhda139hg)。那麼我們得到了2個指向相同資源的URL,這對於RESTful URI來說也不是很漂亮,是嗎?

那麼,什麼是最RESTful解決方案?或者我不應該這樣做RESTful?

+0

您提出了4個問題,我建議您發佈一個問題,以便我可以用簡潔有用的方式回覆。 – dendini

+0

@dendini這4個問題都具有相同的上下文,我不喜歡創建多個問題並且不得不爲每個問題解釋相同的故事。另外一個答案可能會使其他問題過時。如果你喜歡,你只能回答一個問題。如果那能幫助我,我會爲此感恩。 – rednaw

回答

1

REST純粹主義者會認爲使用/accounts/獲得一個帳戶是不好的做法,因爲它應該指定一個集合。請考慮一個不會被誤認爲ID的密鑰,例如,如果您的ID是UUID,那麼請使用諸如'我'之類的標記,以便您的網址爲/accounts/me。這樣做的好處是,如果您希望獲得不同的帳戶信息,例如您需要列出用戶或者您的管理系統使用相同的API,則可以輕鬆地進行擴展。

在URL中輸入用戶名和密碼也不是純粹的REST。查詢參數應該與您正在獲取的資源直接相關;通常會篩選和限制返回的資源。相反,您應該認真考慮通過加密(HTTPS)連接使用諸如HTTP基本身份驗證之類的東西,以便將您的身份驗證/授權和資源系統分離出來。如果你喜歡使用令牌系統,那麼看看oauth或鷹。

最後,是的,如果你使用PUT,你應該提供一個完整的資源標識符。鑑於系統在更新數據之前讀取數據是非常普遍的,缺少ID將不會成爲問題,因爲這將作爲先前GET的一部分回來。

1
  1. 是賬號/?username = dude & password = veryhard是一個正確的REST URL。
  2. PUT與id一起使用,如果它用於更新資源,如果使用它創建,則必須提供一個ID。否則,你使用後不進行身份創建資源