2015-11-19 69 views
2

HTTP 500意味着服務器無法完成請求,出於意外原因。當服務器無法滿足請求時使用的最佳HTTP響應代碼是什麼,其原因是已知預計「無法滿足*已知*原因的請求」的HTTP狀態代碼

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

通過HTTP的一些文件看,我不能找到一個很好的答案,這似乎是一個重要的區別。拋出一個500並不代表「內部服務器錯誤」的錯誤可能不是一個好習慣。

+1

正確的名單看是http://www.iana.org/assignments/http-status-codes/http- status-codes.xhtml,順便說一句。 –

回答

8

不要使用RCF 2616作爲參考

自2014年6月,該RCF 2616已由RFC 7231過時,即成爲語義和HTTP/1.1協議的內容的當前參考。

什麼是已知或預期的原因

根據已知或預期的原因,您可以返回正確的狀態代碼:

  • 無法將請求fullfild,因爲客戶機requeting不存在的資源?退貨404
  • 這是授權問題嗎?去403
  • 使用HTTP authentication和憑證無效?返回401
  • 服務器不支持滿足請求所需的功能嗎?使用501
  • 由於與目標資源的當前狀態發生衝突,無法完成請求嗎?所以應該返回409
  • 目標資源是否被分配了新的永久URI? 301狀態碼是正確的選擇。
  • 等等...

決策圖表

有關詳細信息,請檢查RFC 7231,也有從Racksburg看看下面的decision chart


的狀態代碼分爲三大類:

HTTP status codes categories


從這裏開始:

HTTP status codes



選擇2xx3xx狀態代碼


HTTP 2xx and 3xx status codes



選擇4xx狀態代碼


HTTP 4xx status codes



選擇5xx狀態代碼


HTTP 5xx status codes

1

答案在於定義的其他http代碼的語義。例如,對於受保護的頁面,認證失敗是一個預期的錯誤,所以401是一個合適的響應。 人們甚至可以爭辯說,401是法律迴應,甚至不是錯誤代碼,四種情況。 而這種區別可能是語義上的原因,它可能是不明確的,以決定預期的錯誤代碼實際上是錯誤還是僅僅是請求的合法結果。

1

在許多情況下,返回200並且具有自定義域特定狀態/錯誤代碼/原因可能會更好。

就像你說的那樣,返回500通常表示服務器無法完成執行請求的信號。我想查看500基本上相當於服務器崩潰或拋出異常,並且我會避免拋出任何可以預測和正常處理的錯誤。

如果你正在尋找更像「服務器確實可以評估請求,但發現用戶要求的東西由於某種原因無法完成」的東西(例如某些資源已經耗盡),那麼你很可能除非原因符合4xx範圍內的特定代碼之一(例如,「用戶不具備所需特權」的403),否則最好使用200 +自定義狀態代碼。