2012-02-13 58 views
18

我創建用於創建強制唯一的電子郵件地址的用戶的RESTful API:「此電子郵件已註冊」的哪個HTTP響應代碼?

成功POST /usersHTTP 201 Created

如果我再次POST相同的電子郵件地址,如果響應代碼是什麼?是409 Conflict適當的迴應代碼?

+0

我不認爲這是一個好主意。如果通過某個代理進行連接,結果可能不可預知。 – Cheery 2012-02-13 22:37:01

+0

我認爲這是個好主意!由於HTTP具有狀態碼,所以請使用它們!當你必須稍後調試並且只有訪問文件或其他日誌文件,但是如果存在HTTP代碼時,它也非常方便...... :) – powtac 2012-02-13 23:05:32

+0

'409 - 衝突對於這種響應是非常好的選擇。 – 2012-02-13 23:48:37

回答

34

是無法遵循,409是最合適的響應代碼在這裏。即使您最有可能成功返回201,但您仍然在發佈到被描述爲集合的資源,並且發送重複的電子郵件肯定與作爲集合的「當前資源狀態」發生衝突。如果可能的話,您應該返回一個包含問題描述的響應主體和超鏈接以幫助解決問題。

+0

感謝您確認我的預感與解釋!我沒有想到超鏈接部分,肯定會找出一個包含這個的好方法。 – thatmarvin 2012-02-14 07:39:54

1

我經常使用(WebDAV的延伸)HTTP 422Unprocessable Entity

請求被充分形成,但由於語義錯誤

+0

這部分讓我覺得422不合適:「......但無法處理包含的說明」。在這裏,關於指令的語義沒有歧義 - 服務器理解請求,它只是不會實現它。(加我寧願使用RFC 2616代碼,如果我可以幫助它) – thatmarvin 2012-02-14 07:38:55

6

雖然接受的答案在顯示任務的正確狀態代碼時是正確的,但我想補充一點是您引入了一個安全漏洞。

如果您返回409賬戶註冊,您只是公開一個帳戶枚舉服務。

取決於應用程序,如果API是公開的等,您可能想要返回201即使該帳戶沒有創建。

0

+1給Barts答案 - 出於安全原因。通常我會同意409是一個很好的狀態代碼。已經存在。但在用戶帳戶/認證/授權等環境中,我傾向於不公開數據庫中現有的用戶帳戶。

當然還有其他的機制在這個地方處理安全問題。如果您不介意公開少量帳戶,則可以向您的應用程序添加一個行爲,該行爲在來自一個IP的衆多409事件中返回401或403。

另一個選項(一般來說)是定義一個自己的狀態碼,使其具有與現有標準2xx變體不同的2xx。如果您不想將「已存在」視爲錯誤,那麼這可能是一個選項。但是,這將被視爲非標準的,並且在您的具​​體示例中將具有與409相同的不安全角色。