我只花了20分鐘調試一些(Django)單元測試。我正在測試一個視圖POST,並且我期待着一個302返回代碼,在此之後,我聲稱一堆數據庫實體如預期的那樣。原來最近合併的提交已經添加了一個新的表單字段,並且我的測試失敗了,因爲我沒有包含正確的表單數據。我應該使用HTTP 4xx來表示HTML表單錯誤嗎?
問題是測試失敗,因爲HTTP返回代碼是200,而不是302,我只能通過打印響應HTTP並查看它來解決問題。除了需要查看HTML來解決問題之外,200看起來像一個POST沒有得到處理的錯誤代碼。 4xx(客戶端錯誤)似乎更合適。另外,它會使調試測試變得簡單,因爲響應代碼會直接指出我的問題。
我已閱讀有關使用422(不可處理的實體)作爲REST API中可能的返回碼,但無法在HTML視圖/處理程序中找到任何使用它的證據。
我的問題是 - 是否有其他人這樣做,如果沒有,爲什麼不呢?
[UPDATE 1]
只是爲了澄清,這個問題涉及到HTML表格,而不是一個API。
這也是一個關於HTTP響應代碼本身的問題 - 不是Django。這恰好是我正在使用的。我已經刪除了django標籤。
[UPDATE 2]
一些進一步澄清,以W3C的引用(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):
10.2成功的2xx
這類狀態代碼表示該客戶機的請求被成功地接受,理解和接受。
10.4客戶端錯誤4XX
的4XX類的狀態代碼是用於在客戶端似乎有錯誤的案件。
10.4.1 400錯誤的請求
請求不能被服務器因爲語法錯誤的理解。
而且從https://tools.ietf.org/html/rfc4918#page-78
11.2。 422無法處理的實體
的422(無法處理的實體)狀態代碼表示該服務器 理解請求實體(因此一個 415(不支持的媒體類型)狀態代碼是不適當的)的內容類型,和的所述 語法請求實體是否正確(因此400(錯誤請求) 狀態碼不合適),但無法處理包含的 指令。例如,如果XML 請求主體包含格式正確(即語法正確),但是語義錯誤的XML指令 ,則可能會出現此錯誤情況。
[UPDATE 3]
掘到它,422是一個WebDAV擴展[1],這可以解釋它的模糊。也就是說,由於Twitter使用420用於他們自己的目的,我想我會隨心所欲。但它會與一個4.
[UPDATE 4]
註釋開始於使用定製響應代碼,以及應如何被處理(如果未識別)中,從HTTP 1.1規範(http://tools.ietf.org/html/rfc2616#section-6.1.1):
HTTP狀態碼是可擴展的。 HTTP應用程序不需要 來理解所有註冊狀態代碼的含義,雖然這樣的理解顯然是可取的。但是,應用程序必須瞭解任何狀態代碼的類別(如第一個 數字所示),並將任何未識別的響應視爲等同於該類別的 x00狀態代碼,但不應將無法識別的響應緩存。例如,如果客戶端接收到一個 無法識別的狀態碼431,則它可以安全地假定其請求出現問題,並且 將該響應視爲已收到400狀態碼。在這種情況下,用戶代理應該向用戶呈現帶有響應的返回 的實體,因爲該實體可能包括可解釋異常狀態的可讀信息。
[1] https://tools.ietf.org/html/rfc4918
這真的取決於您決定如何設計您的API。我不確定422是最好的響應代碼,但是可以確定的是,您可以在4xx範圍內發送除200之外的其他內容。 – 2013-03-22 22:45:51
@MattBall出於興趣 - 你爲什麼不認爲這是最好的代碼? (我也沒有答案 - 但是以4開頭的東西比2更好)? – 2013-03-22 23:05:26
不直接回答你的問題,但http://stackoverflow.com/q/1959947/139010。 – 2013-03-22 23:11:58