我創建用於創建強制唯一的電子郵件地址的用戶的RESTful API:「此電子郵件已註冊」的哪個HTTP響應代碼?
成功POST /users
:HTTP 201 Created
如果我再次POST
相同的電子郵件地址,如果響應代碼是什麼?是409 Conflict
適當的迴應代碼?
我創建用於創建強制唯一的電子郵件地址的用戶的RESTful API:「此電子郵件已註冊」的哪個HTTP響應代碼?
成功POST /users
:HTTP 201 Created
如果我再次POST
相同的電子郵件地址,如果響應代碼是什麼?是409 Conflict
適當的迴應代碼?
是無法遵循,409是最合適的響應代碼在這裏。即使您最有可能成功返回201,但您仍然在發佈到被描述爲集合的資源,並且發送重複的電子郵件肯定與作爲集合的「當前資源狀態」發生衝突。如果可能的話,您應該返回一個包含問題描述的響應主體和超鏈接以幫助解決問題。
感謝您確認我的預感與解釋!我沒有想到超鏈接部分,肯定會找出一個包含這個的好方法。 – thatmarvin 2012-02-14 07:39:54
我經常使用(WebDAV的延伸)HTTP 422
Unprocessable Entity:
請求被充分形成,但由於語義錯誤
這部分讓我覺得422不合適:「......但無法處理包含的說明」。在這裏,關於指令的語義沒有歧義 - 服務器理解請求,它只是不會實現它。(加我寧願使用RFC 2616代碼,如果我可以幫助它) – thatmarvin 2012-02-14 07:38:55
雖然接受的答案在顯示任務的正確狀態代碼時是正確的,但我想補充一點是您引入了一個安全漏洞。
如果您返回409賬戶註冊,您只是公開一個帳戶枚舉服務。
取決於應用程序,如果API是公開的等,您可能想要返回201即使該帳戶沒有創建。
+1給Barts答案 - 出於安全原因。通常我會同意409是一個很好的狀態代碼。已經存在。但在用戶帳戶/認證/授權等環境中,我傾向於不公開數據庫中現有的用戶帳戶。
當然還有其他的機制在這個地方處理安全問題。如果您不介意公開少量帳戶,則可以向您的應用程序添加一個行爲,該行爲在來自一個IP的衆多409事件中返回401或403。
另一個選項(一般來說)是定義一個自己的狀態碼,使其具有與現有標準2xx變體不同的2xx。如果您不想將「已存在」視爲錯誤,那麼這可能是一個選項。但是,這將被視爲非標準的,並且在您的具體示例中將具有與409相同的不安全角色。
我不認爲這是一個好主意。如果通過某個代理進行連接,結果可能不可預知。 – Cheery 2012-02-13 22:37:01
我認爲這是個好主意!由於HTTP具有狀態碼,所以請使用它們!當你必須稍後調試並且只有訪問文件或其他日誌文件,但是如果存在HTTP代碼時,它也非常方便...... :) – powtac 2012-02-13 23:05:32
'409 - 衝突對於這種響應是非常好的選擇。 – 2012-02-13 23:48:37