HTTP協(xié)議之狀態(tài)碼詳解
HTTP狀態(tài)碼,我都是現(xiàn)查現(xiàn)用。 我以前記得幾個常用的狀態(tài)碼,比如200,302,304,404, 503。 一般來說我也只需要了解這些常用的狀態(tài)碼就可以了。 如果是做AJAX,REST,網(wǎng)絡(luò)爬蟲,機器人等程序。還是需要了解其他狀態(tài)碼。 本文我花了一個多月的時間把所有的狀態(tài)碼都總結(jié)了下,內(nèi)容太多,看的時候麻煩耐心點了。
HTTP狀態(tài)碼的學(xué)習(xí)資料到處都有,但是都是理論上講解。 本文介紹HTTP協(xié)議中的HTTP狀態(tài)碼(HTTP Status Code), 會對大部分的狀態(tài)碼都進行了詳細的實例講解。
要了解狀態(tài)碼,應(yīng)該在實例中去理解狀態(tài)碼的意義,否則看了也會忘記的。
用Fiddler工具可以查看HTTP Request和Response, 還可以方便地查看Response中的狀態(tài)碼, 如果不熟悉這個工具,可以先參考【Fiddler教程】
為了重現(xiàn)HTTP 狀態(tài)碼,本文會使用Fiddler Composer來創(chuàng)建“特殊的HTTP Request”.可以參考【Fiddler Composer創(chuàng)建和發(fā)送HTTP Request】
什么是HTTP狀態(tài)碼
HTTP狀態(tài)碼的作用是:Web服務(wù)器用來告訴客戶端,發(fā)生了什么事。
狀態(tài)碼位于HTTP Response 的***行中,會返回一個”三位數(shù)字的狀態(tài)碼“和一個“狀態(tài)消息”。 ”三位數(shù)字的狀態(tài)碼“便于程序進行處理, “狀態(tài)消息”更便于人理解。
如下圖, 當客戶端請求一個不存在的URL的時候, Web服務(wù)器會返回 “HTTP/1.1 404 Not Found” 告訴瀏覽器客戶端。 服務(wù)器無法找到所請求的URL。

狀態(tài)碼分類
HTTP狀態(tài)碼被分為五大類, 目前我們使用的HTTP協(xié)議版本是1.1, 支持以下的狀態(tài)碼。隨著協(xié)議的發(fā)展,HTTP規(guī)范中會定義更多的狀態(tài)碼。
小技巧: 假如你看到一個狀態(tài)碼518, 你并不知道具體518是什么意思。 這時候你只要知道518是屬于(5XX,服務(wù)器錯誤就可以了)
常見的狀態(tài)碼
一般人只需要了解以下常見的狀態(tài)碼就夠了, 如果你想了解更多, 請繼續(xù)往下看。
1XX信息性狀態(tài)碼
這些狀態(tài)碼是HTTP 1.1引入的。 對于這些狀態(tài)碼的價值還存在爭論 (我個人從來沒見過這些狀態(tài)碼, 也沒有理解這些狀態(tài)碼。)
2XX成功狀態(tài)碼
客戶端發(fā)起請求時, 這些請求通常都是成功的。服務(wù)器有一組用來表示成功的狀態(tài)碼,分別對應(yīng)于不同類型的請求。
3XX重定向狀態(tài)碼
重定向狀態(tài)碼用來告訴瀏覽器客戶端,它們訪問的資源已被移動, Web服務(wù)器發(fā)送一個重定向狀態(tài)碼和一個可選的Location Header, 告訴客戶端新的資源地址在哪。
瀏覽器客戶端會自動用Location中提供的地址,重新發(fā)送新的Request。 這個過程對用戶來說是透明的。
301和302 非常相似, 一個是***轉(zhuǎn)移,一個是臨時轉(zhuǎn)移。
(SEO中,搜索引擎如果碰到301, 比如網(wǎng)頁A用301重定向到網(wǎng)頁B,搜索引擎可以肯定網(wǎng)頁A***性改變地址,就會把網(wǎng)頁B當做***有效目標)
302,303,307 是一樣。 這是因為302是HTTP 1.0定義的, HTTP1.1中使用303,307. 同時又保留了302. (但在現(xiàn)實中,我們還是用302,我是沒見過303和307)
所以這一節(jié), 我們只需要掌握302, 304 就可以了。
4XX客戶端錯誤狀態(tài)碼
有時客戶端會發(fā)送一些服務(wù)器無法處理的東西,比如格式錯誤的Request, 或者最常見的是, 請求一個不存在的URL。
5XX服務(wù)器錯誤狀態(tài)碼
有時候客戶端發(fā)送了一條有效Request, Web服務(wù)器自身卻出錯了。 可能是Web服務(wù)器運行出錯了, 或者網(wǎng)站都掛了。 5XX就是用來描述服務(wù)器錯誤的。
204 No Content(沒有內(nèi)容)
返回的Response中只有一些Header和一個狀態(tài)行, 沒有實體的主題內(nèi)容(沒有response body)
204狀態(tài)碼的作用在于: 1. 在不獲取資源的情況下了解資源的情況(比如判斷其類型)
2. 通過查看Response中的狀態(tài)碼, 看看某個對象是否存在
3. 通過查看Header, 測試資源是否被修改了。
實例:先打開Fiddler, 然后啟動瀏覽器訪問ditu.google.cn, 你會捕獲到很多204

206 Partial Content(部分內(nèi)容)
206狀態(tài)碼代表服務(wù)器已經(jīng)成功處理了部分GET請求(只有發(fā)送GET 方法的request, web服務(wù)器才可能返回206),
應(yīng)用場景:
1. FlashGet, 迅雷或者HTTP下載工具都是使用206狀態(tài)碼來實現(xiàn)斷點續(xù)傳
2. 將以個大文檔分解為多個下載段同時下載 比如,在線看視頻
實例: 一些流媒體技術(shù)比如在線視頻,可以邊看邊下載。 就是使用206來實現(xiàn)的。
打開Fiddler, 然后用瀏覽器打開“搜狐視頻中的綠箭俠” http://tv.sohu.com/20121011/n354681393.shtml 然后你在Fiddler中就能看到一堆的206
1. 瀏覽器發(fā)送一個Get 方法的request. header中包含 Range: bytes=5303296-5336063. (意思就是請求得到5303296-5336063這個范圍的數(shù)據(jù))。
2. Web服務(wù)器返回一個206 的Response. header中包含Content-Range: bytes 5303296-5336063/12129376(表明這次返回的內(nèi)容范圍)

301 Moved Permanently(***移除)
請求的URL已移走。Response中應(yīng)該包含一個Location URL, 說明資源現(xiàn)在所處的位置
例如: 1. 瀏覽器客戶端訪問 http://map.google.cn
2. Web服務(wù)器返回Response 301,Location=http://titu.google.cn (告訴客戶端我們的資源位于這里, )
3. 瀏覽器客戶端會自動再發(fā)送一個Request 去訪問http://titu.google.cn

400 Bad Request(壞請求)
發(fā)送的Request中的數(shù)據(jù)有錯誤(比如:表單有錯誤,Cookie有錯誤), 這個我們也經(jīng)常見到。
實例: 還沒想到, 想到了再貼個實例上來。
403 Forbidden(禁止)
Web客戶端發(fā)送的請求被Web服務(wù)器拒絕了, 如果服務(wù)器想說明為什么拒絕請求,可以包含實體的主體部分來對原因進行描述。但這個狀態(tài)碼通常是服務(wù)器不想說明拒絕原因。
訪問下面的URL, 會被服務(wù)器拒絕. 并且返回403狀態(tài)碼
http://t2.baidu.com/it/u=1791561788,200960144&fm=0&gp=0.jpg#p#
404 Page not Found (請求的資源不存在)
這個大家都懂的, 值得一提的是: 騰訊把404頁面做成了“尋找被拐兒童”

405 Method Not Allowed(不允許使用的方法)
405是指Web服務(wù)器不支持Request中的方法。
我個人認為狀態(tài)碼405Method Not Allowed和501 Not Implemented 是一樣的意思。都是不支持Request的方法。 (目前我還不知道這兩個的區(qū)別)
實例: 發(fā)送一個是trace方法的Request 給www.google.com


411 Length Required(要求長度指示)
服務(wù)器要求在Request中包含Content-Length。
當瀏覽器使用Post方法,發(fā)送數(shù)據(jù)給Web服務(wù)器時, 必須要有Content-Length。這樣Web服務(wù)器才知道你要發(fā)送多少數(shù)據(jù),否則Web服務(wù)器會返回411狀態(tài)碼
實例: 發(fā)送一個Post方法的Request 給www.google.com. Request中沒有Content-Length


413 Request Entity Too Large(請求實體太大)
作用:客戶端發(fā)送的實體主體部分比服務(wù)器能夠或者希望處理的要大。 一般情況下我們看不到這個狀態(tài)碼。 因為瀏覽器不會發(fā)送太大的數(shù)據(jù)給網(wǎng)站,但是機器人可能會。
實例: 用post方法發(fā)送一個大文件(100MB以上)給www.google.com


414 Request URI Too Long(請求URI太長)
就是說Request URI太長, 一般瀏覽器本身對URI的長度就會有限制,所以不會發(fā)送URI很長的Request. 我們平常是根本看不到414錯誤的。 但是機器人可以發(fā)送很長URI。
例如:我們用Fiddler Composer發(fā)送一個很長的URI給Google, 比如 "www.google.com?q=asdfasdasf.." q=后面的參數(shù)很長。 就可以看到414了


500 Internal Server Error(內(nèi)部服務(wù)器錯誤)
這個太常見了, 我們開發(fā)網(wǎng)站的時候,當我們的程序出錯了時,就會返回500錯誤。
實例:ASP.NET 程序出錯


501 Not Implemented(未實現(xiàn))
客戶端發(fā)起的請求超出服務(wù)器的能力范圍(比如,使用了服務(wù)器不支持的請求方法)時,使用此狀態(tài)碼)。 一般的Web服務(wù)器只支持GET和POST方法。
實例: 使用Fiddler Composer 給www.qq.com, 發(fā)送一個OPTIONS 方法的Request. 服務(wù)器就能返回501了。


502 Bad Gateway(網(wǎng)關(guān)故障)
代理使用的服務(wù)器遇到了上游的無效響應(yīng)。
Fiddler本身就是代理服務(wù)器。 當我們訪問www.facebook.com,這網(wǎng)站被我們天朝屏蔽了。 所以我們可以得到502

505 HTTP Version Not Supported(不支持的HTTP版本)
表示W(wǎng)eb服務(wù)器不支持此HTTP協(xié)議的版本。
眾所周知我們現(xiàn)在使用的HTTP協(xié)議版本是HTTP/1.1, 如果我們發(fā)送一個HTTP/2.0 的request 給博客園, 博客園肯定不能支持HTTP/2.0,所以會返回505
想要發(fā)送這樣的request, 可以使用Fiddler工具中的Composer來發(fā)送自定義的request, 如下圖。

