1. 程式人生 > >網路請求返回碼說明

網路請求返回碼說明

使用ASP.NET/PHP/JSP 或者javascript都會用到http的不同狀態,一些常見的狀態碼為:
200 – 伺服器成功返回網頁 404 – 請求的網頁不存在 503 – 服務不可用

1xx(臨時響應)

表示臨時響應並需要請求者繼續執行操作的狀態程式碼。

  • 100 (繼續) 請求者應當繼續提出請求。 伺服器返回此程式碼表示已收到請求的第一部分,正在等待其餘部分。
  • 101 (切換協議) 請求者已要求伺服器切換協議,伺服器已確認並準備切換。

2xx (成功)

表示成功處理了請求的狀態程式碼。

  • 200 (成功) 伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。
  • 201 (已建立) 請求成功並且伺服器建立了新的資源。
  • 202 (已接受) 伺服器已接受請求,但尚未處理。
  • 203 (非授權資訊) 伺服器已成功處理了請求,但返回的資訊可能來自另一來源。
  • 204 (無內容) 伺服器成功處理了請求,但沒有返回任何內容。
  • 205 (重置內容) 伺服器成功處理了請求,但沒有返回任何內容。
  • 206 (部分內容) 伺服器成功處理了部分 GET 請求。

3xx (重定向)

表示要完成請求,需要進一步操作。 通常,這些狀態程式碼用來重定向。

  • 300 (多種選擇) 針對請求,伺服器可執行多種操作。 伺服器可根據請求者 (user agent) 選擇一項操作,或提供操作列表供請求者選擇。
  • 301 (永久移動) 請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。
  • 302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。
  • 303 (檢視其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,伺服器返回此程式碼。
  • 304 (未修改) 自從上次請求後,請求的網頁未修改過。 伺服器返回此響應時,不會返回網頁內容。
  • 305 (使用代理) 請求者只能使用代理訪問請求的網頁。 如果伺服器返回此響應,還表示請求者應使用代理。
  • 307 (臨時重定向) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。

4xx(請求錯誤)

這些狀態程式碼表示請求可能出錯,妨礙了伺服器的處理。

  • 400 (錯誤請求) 伺服器不理解請求的語法。
  • 401 (未授權) 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。
  • 403 (禁止) 伺服器拒絕請求。
  • 404 (未找到) 伺服器找不到請求的網頁。
  • 405 (方法禁用) 禁用請求中指定的方法。
  • 406 (不接受) 無法使用請求的內容特性響應請求的網頁。
  • 407 (需要代理授權) 此狀態程式碼與 401(未授權)類似,但指定請求者應當授權使用代理。
  • 408 (請求超時) 伺服器等候請求時發生超時。
  • 409 (衝突) 伺服器在完成請求時發生衝突。 伺服器必須在響應中包含有關衝突的資訊。
  • 410 (已刪除) 如果請求的資源已永久刪除,伺服器就會返回此響應。
  • 411 (需要有效長度) 伺服器不接受不含有效內容長度標頭欄位的請求。
  • 412 (未滿足前提條件) 伺服器未滿足請求者在請求中設定的其中一個前提條件。
  • 413 (請求實體過大) 伺服器無法處理請求,因為請求實體過大,超出伺服器的處理能力。
  • 414 (請求的 URI 過長) 請求的 URI(通常為網址)過長,伺服器無法處理。
  • 415 (不支援的媒體型別) 請求的格式不受請求頁面的支援。
  • 416 (請求範圍不符合要求) 如果頁面無法提供請求的範圍,則伺服器會返回此狀態程式碼。
  • 417 (未滿足期望值) 伺服器未滿足”期望”請求標頭欄位的要求。

5xx(伺服器錯誤)

這些狀態程式碼表示伺服器在嘗試處理請求時發生內部錯誤。 這些錯誤可能是伺服器本身的錯誤,而不是請求出錯。

  • 500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。
  • 501 (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。
  • 502 (錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。
  • 503 (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。
  • 504 (閘道器超時) 伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。
  • 505 (HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。

HTTP 協議一直在演變,新的狀態碼對於開發 REST 服務或者說是基於 HTTP 的服務非常有用,下面我們為你詳細介紹這四個新的狀態碼以及是否應該使用。

428 Precondition Required (要求先決條件)

先決條件是客戶端傳送 HTTP 請求時,如果想要請求能成功必須滿足一些預設的條件。 一個好的例子就是 If-None-Match 頭,經常在 GET 請求中使用,如果指定了 If-None-Match ,那麼客戶端只在響應中的 ETag 改變後才會重新接收回應。先決條件的另外一個例子就是 If-Match 頭,這個一般用在 PUT 請求上用於指示只更新沒被改變的資源,這在多個客戶端使用 HTTP 服務時用來防止彼此間不會覆蓋相同內容。當伺服器端使用 428 Precondition Required 狀態碼時,表示客戶端必須傳送上述的請求頭才能執行請求,這個方法為伺服器提供一種有效的方法來阻止 'lost update' 問題。

429 Too Many Requests (太多請求)

當你需要限制客戶端請求某個服務數量時,該狀態碼就很有用,也就是請求速度限制。在此之前,有一些類似的狀態碼,例如 '509 Bandwidth Limit Exceeded'. Twitter 使用 420 (這不是HTTP定義的狀態碼)如果你希望限制客戶端對服務的請求數,可使用 429 狀態碼,同時包含一個 Retry-After 響應頭用於告訴客戶端多長時間後可以再次請求服務。

431 Request Header Fields Too Large (請求頭欄位太大)

某些情況下,客戶端傳送 HTTP 請求頭會變得很大,那麼伺服器可傳送 431 Request Header Fields Too Large 來指明該問題。我不太清楚為什麼沒有 430 狀態碼,而是直接從 429 跳到 431,我嘗試搜尋但沒有結果。唯一的猜測是 430 Forbidden 跟 403 Forbidden 太像了,為了避免混淆才這麼做的,天知道!

511 Network Authentication Required (要求網路認證)

對我來說這個狀態碼很有趣,如果你在開發一個 HTTP 伺服器,你不一定需要處理該狀態碼,但如果你在編寫 HTTP 客戶端,那這個狀態碼就非常重要。如果你頻繁使用筆記本和智慧手機,你可能會注意到大量的公用 WIFI 服務要求你必須接受一些協議或者必須登入後才能使用。這是通過攔截HTTP流量,當用戶試圖訪問網路返回一個重定向和登入,這很討厭,但是實際情況就是這樣的。使用這些“攔截”客戶端,會有一些討厭的副作用。在 RFC 中有提到這兩個的例子:如果你在登入WIFI前訪問某個網站,網路裝置將會攔截首個請求,這些裝置往往也有自己的網站圖示 ‘favicon.ico'。登入後您會發現,有一段時間內你訪問的網站圖示一直是WIFI登入網站的圖示。如果客戶端使用HTTP請求來查詢文件(可能是JSON),網路將會響應一個登入頁,這樣你的客戶端就會解析錯誤並導致客戶端執行異常,在現實中這種問題非常常見。因此 511 狀態碼的提出就是為了解決這個問題。如果你正在編寫 HTTP 的客戶端,你最好還是檢查 511 狀態碼以確認是否需要認證後才能訪問。