亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747


響應(yīng)狀態(tài)碼該怎么用?

 

前兩講中,我們學(xué)習(xí)了 HTTP 報(bào)文里請(qǐng)求行的組成部分,包括請(qǐng)求方法和 URI。有了請(qǐng)求行,加上后面的頭字段就形成了請(qǐng)求頭,可以通過(guò) TCP/IP 協(xié)議發(fā)送給服務(wù)器。

服務(wù)器收到請(qǐng)求報(bào)文,解析后需要進(jìn)行處理,具體的業(yè)務(wù)邏輯多種多樣,但最后必定是拼出一個(gè)響應(yīng)報(bào)文發(fā)回客戶(hù)端。

響應(yīng)報(bào)文由響應(yīng)頭加響應(yīng)體數(shù)據(jù)組成,響應(yīng)頭又由狀態(tài)行和頭字段構(gòu)成。

我們先來(lái)復(fù)習(xí)一下?tīng)顟B(tài)行的結(jié)構(gòu),有三部分:

響應(yīng)狀態(tài)碼該怎么用?

 

開(kāi)頭的 Version 部分是 HTTP 協(xié)議的版本號(hào),通常是 HTTP/1.1,用處不是很大。

后面的 Reason 部分是原因短語(yǔ),是狀態(tài)碼的簡(jiǎn)短文字描述,例如“OK”“Not Found”等等,也可以自定義。但它只是為了兼容早期的文本客戶(hù)端而存在,提供的信息很有限,目前的大多數(shù)客戶(hù)端都會(huì)忽略它。

所以,狀態(tài)行里有用的就只剩下中間的狀態(tài)碼(Status Code)了。它是一個(gè)十進(jìn)制數(shù)字,以代碼的形式表示服務(wù)器對(duì)請(qǐng)求的處理結(jié)果,就像我們通常編寫(xiě)程序時(shí)函數(shù)返回的錯(cuò)誤碼一樣。

不過(guò)你要注意,它的名字是“狀態(tài)碼”而不是“錯(cuò)誤碼”。也就是說(shuō),它的含義不僅是錯(cuò)誤,更重要的意義在于表達(dá) HTTP 數(shù)據(jù)處理的“狀態(tài)”,客戶(hù)端可以依據(jù)代碼適時(shí)轉(zhuǎn)換處理狀態(tài),例如繼續(xù)發(fā)送請(qǐng)求、切換協(xié)議,重定向跳轉(zhuǎn)等,有那么點(diǎn) TCP 狀態(tài)轉(zhuǎn)換的意思。

狀態(tài)碼

目前 RFC 標(biāo)準(zhǔn)里規(guī)定的狀態(tài)碼是三位數(shù),所以取值范圍就是從 000 到 999。但如果把代碼簡(jiǎn)單地從 000 開(kāi)始順序編下去就顯得有點(diǎn)太“low”,不靈活、不利于擴(kuò)展,所以狀態(tài)碼也被設(shè)計(jì)成有一定的格式。

RFC 標(biāo)準(zhǔn)把狀態(tài)碼分成了五類(lèi),用數(shù)字的第一位表示分類(lèi),而 0~99 不用,這樣狀態(tài)碼的實(shí)際可用范圍就大大縮小了,由 000~999 變成了 100~599。

這五類(lèi)的具體含義是:

  • 1××:提示信息,表示目前是協(xié)議處理的中間狀態(tài),還需要后續(xù)的操作;
  • 2××:成功,報(bào)文已經(jīng)收到并被正確處理;
  • 3××:重定向,資源位置發(fā)生變動(dòng),需要客戶(hù)端重新發(fā)送請(qǐng)求;
  • 4××:客戶(hù)端錯(cuò)誤,請(qǐng)求報(bào)文有誤,服務(wù)器無(wú)法處理;
  • 5××:服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求時(shí)內(nèi)部發(fā)生了錯(cuò)誤。

在 HTTP 協(xié)議中,正確地理解并應(yīng)用這些狀態(tài)碼不是客戶(hù)端或服務(wù)器單方的責(zé)任,而是雙方共同的責(zé)任。

客戶(hù)端作為請(qǐng)求的發(fā)起方,獲取響應(yīng)報(bào)文后,需要通過(guò)狀態(tài)碼知道請(qǐng)求是否被正確處理,是否要再次發(fā)送請(qǐng)求,如果出錯(cuò)了原因又是什么。這樣才能進(jìn)行下一步的動(dòng)作,要么發(fā)送新請(qǐng)求,要么改正錯(cuò)誤重發(fā)請(qǐng)求。

服務(wù)器端作為請(qǐng)求的接收方,也應(yīng)該很好地運(yùn)用狀態(tài)碼。在處理請(qǐng)求時(shí),選擇最恰當(dāng)?shù)臓顟B(tài)碼回復(fù)客戶(hù)端,告知客戶(hù)端處理的結(jié)果,指示客戶(hù)端下一步應(yīng)該如何行動(dòng)。特別是在出錯(cuò)的時(shí)候,盡量不要簡(jiǎn)單地返 400、500 這樣意思含糊不清的狀態(tài)碼。

目前 RFC 標(biāo)準(zhǔn)里總共有 41 個(gè)狀態(tài)碼,但狀態(tài)碼的定義是開(kāi)放的,允許自行擴(kuò)展。所以 Apache、Nginx 等 Web 服務(wù)器都定義了一些專(zhuān)有的狀態(tài)碼。如果你自己開(kāi)發(fā) Web 應(yīng)用,也完全可以在不沖突的前提下定義新的代碼。

在我們的實(shí)驗(yàn)環(huán)境里也可以對(duì)這些狀態(tài)碼做測(cè)試驗(yàn)證,訪(fǎng)問(wèn) URI“/12-1”,用查詢(xún)參數(shù)“code=xxx”來(lái)檢查這些狀態(tài)碼的效果,服務(wù)器不僅會(huì)在狀態(tài)行里顯示狀態(tài)碼,還會(huì)在響應(yīng)頭里用自定義的“Expect-Code”字段輸出這個(gè)代碼。

例如,在 Chrome 里訪(fǎng)問(wèn)“http://www.chrono.com/12-1?code=405”的結(jié)果如下圖。

響應(yīng)狀態(tài)碼該怎么用?

 

接下來(lái)我就挑一些實(shí)際開(kāi)發(fā)中比較有價(jià)值的狀態(tài)碼逐個(gè)詳細(xì)介紹。

1××

1××類(lèi)狀態(tài)碼屬于提示信息,是協(xié)議處理的中間狀態(tài),實(shí)際能夠用到的時(shí)候很少。

我們偶爾能夠見(jiàn)到的是“101 Switching Protocols”。它的意思是客戶(hù)端使用 Upgrade 頭字段,要求在 HTTP 協(xié)議的基礎(chǔ)上改成其他的協(xié)議繼續(xù)通信,比如 WebSocket。而如果服務(wù)器也同意變更協(xié)議,就會(huì)發(fā)送狀態(tài)碼 101,但這之后的數(shù)據(jù)傳輸就不會(huì)再使用 HTTP 了。

2××

2××類(lèi)狀態(tài)碼表示服務(wù)器收到并成功處理了客戶(hù)端的請(qǐng)求,這也是客戶(hù)端最愿意看到的狀態(tài)碼。

200 OK”是最常見(jiàn)的成功狀態(tài)碼,表示一切正常,服務(wù)器如客戶(hù)端所期望的那樣返回了處理結(jié)果,如果是非 HEAD 請(qǐng)求,通常在響應(yīng)頭后都會(huì)有 body 數(shù)據(jù)。

204 No Content”是另一個(gè)很常見(jiàn)的成功狀態(tài)碼,它的含義與“200 OK”基本相同,但響應(yīng)頭后沒(méi)有 body 數(shù)據(jù)。所以對(duì)于 Web 服務(wù)器來(lái)說(shuō),正確地區(qū)分 200 和 204 是很必要的。

206 Partial Content”是 HTTP 分塊下載或斷點(diǎn)續(xù)傳的基礎(chǔ),在客戶(hù)端發(fā)送“范圍請(qǐng)求”、要求獲取資源的部分?jǐn)?shù)據(jù)時(shí)出現(xiàn),它與 200 一樣,也是服務(wù)器成功處理了請(qǐng)求,但 body 里的數(shù)據(jù)不是資源的全部,而是其中的一部分。

狀態(tài)碼 206 通常還會(huì)伴隨著頭字段“Content-Range”,表示響應(yīng)報(bào)文里 body 數(shù)據(jù)的具體范圍,供客戶(hù)端確認(rèn),例如“Content-Range: bytes 0-99/2000”,意思是此次獲取的是總計(jì) 2000 個(gè)字節(jié)的前 100 個(gè)字節(jié)。

3××

3××類(lèi)狀態(tài)碼表示客戶(hù)端請(qǐng)求的資源發(fā)生了變動(dòng),客戶(hù)端必須用新的 URI 重新發(fā)送請(qǐng)求獲取資源,也就是通常所說(shuō)的“重定向”,包括著名的 301、302 跳轉(zhuǎn)。

301 Moved Permanently”俗稱(chēng)“永久重定向”,含義是此次請(qǐng)求的資源已經(jīng)不存在了,需要改用改用新的 URI 再次訪(fǎng)問(wèn)。

與它類(lèi)似的是“302 Found”,曾經(jīng)的描述短語(yǔ)是“Moved Temporarily”,俗稱(chēng)“臨時(shí)重定向”,意思是請(qǐng)求的資源還在,但需要暫時(shí)用另一個(gè) URI 來(lái)訪(fǎng)問(wèn)。

301 和 302 都會(huì)在響應(yīng)頭里使用字段Location指明后續(xù)要跳轉(zhuǎn)的 URI,最終的效果很相似,瀏覽器都會(huì)重定向到新的 URI。兩者的根本區(qū)別在于語(yǔ)義,一個(gè)是“永久”,一個(gè)是“臨時(shí)”,所以在場(chǎng)景、用法上差距很大。

比如,你的網(wǎng)站升級(jí)到了 HTTPS,原來(lái)的 HTTP 不打算用了,這就是“永久”的,所以要配置 301 跳轉(zhuǎn),把所有的 HTTP 流量都切換到 HTTPS。

再比如,今天夜里網(wǎng)站后臺(tái)要系統(tǒng)維護(hù),服務(wù)暫時(shí)不可用,這就屬于“臨時(shí)”的,可以配置成 302 跳轉(zhuǎn),把流量臨時(shí)切換到一個(gè)靜態(tài)通知頁(yè)面,瀏覽器看到這個(gè) 302 就知道這只是暫時(shí)的情況,不會(huì)做緩存優(yōu)化,第二天還會(huì)訪(fǎng)問(wèn)原來(lái)的地址。

304 Not Modified” 是一個(gè)比較有意思的狀態(tài)碼,它用于 If-Modified-Since 等條件請(qǐng)求,表示資源未修改,用于緩存控制。它不具有通常的跳轉(zhuǎn)含義,但可以理解成“重定向已到緩存的文件”(即“緩存重定向”)。

301、302 和 304 分別涉及了 HTTP 協(xié)議里重要的“重定向跳轉(zhuǎn)”和“緩存控制”,在之后的課程中我還會(huì)細(xì)講。

4××

4××類(lèi)狀態(tài)碼表示客戶(hù)端發(fā)送的請(qǐng)求報(bào)文有誤,服務(wù)器無(wú)法處理,它就是真正的“錯(cuò)誤碼”含義了。

400 Bad Request”是一個(gè)通用的錯(cuò)誤碼,表示請(qǐng)求報(bào)文有錯(cuò)誤,但具體是數(shù)據(jù)格式錯(cuò)誤、缺少請(qǐng)求頭還是 URI 超長(zhǎng)它沒(méi)有明確說(shuō),只是一個(gè)籠統(tǒng)的錯(cuò)誤,客戶(hù)端看到 400 只會(huì)是“一頭霧水”“不知所措”。所以,在開(kāi)發(fā) Web 應(yīng)用時(shí)應(yīng)當(dāng)盡量避免給客戶(hù)端返回 400,而是要用其他更有明確含義的狀態(tài)碼。

403 Forbidden”實(shí)際上不是客戶(hù)端的請(qǐng)求出錯(cuò),而是表示服務(wù)器禁止訪(fǎng)問(wèn)資源。原因可能多種多樣,例如信息敏感、法律禁止等,如果服務(wù)器友好一點(diǎn),可以在 body 里詳細(xì)說(shuō)明拒絕請(qǐng)求的原因,不過(guò)現(xiàn)實(shí)中通常都是直接給一個(gè)“閉門(mén)羹”。

404 Not Found”可能是我們最常看見(jiàn)也是最不愿意看到的一個(gè)狀態(tài)碼,它的原意是資源在本服務(wù)器上未找到,所以無(wú)法提供給客戶(hù)端。但現(xiàn)在已經(jīng)被“用濫了”,只要服務(wù)器“不高興”就可以給出個(gè) 404,而我們也無(wú)從得知后面到底是真的未找到,還是有什么別的原因,某種程度上它比 403 還要令人討厭。

4××里剩下的一些代碼較明確地說(shuō)明了錯(cuò)誤的原因,都很好理解,開(kāi)發(fā)中常用的有:

  • 405 Method Not Allowed:不允許使用某些方法操作資源,例如不允許 POST 只能 GET;
  • 406 Not Acceptable:資源無(wú)法滿(mǎn)足客戶(hù)端請(qǐng)求的條件,例如請(qǐng)求中文但只有英文;
  • 408 Request Timeout:請(qǐng)求超時(shí),服務(wù)器等待了過(guò)長(zhǎng)的時(shí)間;
  • 409 Conflict:多個(gè)請(qǐng)求發(fā)生了沖突,可以理解為多線(xiàn)程并發(fā)時(shí)的競(jìng)態(tài);
  • 413 Request Entity Too Large:請(qǐng)求報(bào)文里的 body 太大;
  • 414 Request-URI Too Long:請(qǐng)求行里的 URI 太大;
  • 429 Too Many Requests:客戶(hù)端發(fā)送了太多的請(qǐng)求,通常是由于服務(wù)器的限連策略;
  • 431 Request Header Fields Too Large:請(qǐng)求頭某個(gè)字段或總體太大;

5××

5××類(lèi)狀態(tài)碼表示客戶(hù)端請(qǐng)求報(bào)文正確,但服務(wù)器在處理時(shí)內(nèi)部發(fā)生了錯(cuò)誤,無(wú)法返回應(yīng)有的響應(yīng)數(shù)據(jù),是服務(wù)器端的“錯(cuò)誤碼”。

500 Internal Server Error”與 400 類(lèi)似,也是一個(gè)通用的錯(cuò)誤碼,服務(wù)器究竟發(fā)生了什么錯(cuò)誤我們是不知道的。不過(guò)對(duì)于服務(wù)器來(lái)說(shuō)這應(yīng)該算是好事,通常不應(yīng)該把服務(wù)器內(nèi)部的詳細(xì)信息,例如出錯(cuò)的函數(shù)調(diào)用棧告訴外界。雖然不利于調(diào)試,但能夠防止黑客的窺探或者分析。

501 Not Implemented”表示客戶(hù)端請(qǐng)求的功能還不支持,這個(gè)錯(cuò)誤碼比 500 要“溫和”一些,和“即將開(kāi)業(yè),敬請(qǐng)期待”的意思差不多,不過(guò)具體什么時(shí)候“開(kāi)業(yè)”就不好說(shuō)了。

502 Bad Gateway”通常是服務(wù)器作為網(wǎng)關(guān)或者代理時(shí)返回的錯(cuò)誤碼,表示服務(wù)器自身工作正常,訪(fǎng)問(wèn)后端服務(wù)器時(shí)發(fā)生了錯(cuò)誤,但具體的錯(cuò)誤原因也是不知道的。

503 Service Unavailable”表示服務(wù)器當(dāng)前很忙,暫時(shí)無(wú)法響應(yīng)服務(wù),我們上網(wǎng)時(shí)有時(shí)候遇到的“網(wǎng)絡(luò)服務(wù)正忙,請(qǐng)稍后重試”的提示信息就是狀態(tài)碼 503。

503 是一個(gè)“臨時(shí)”的狀態(tài),很可能過(guò)幾秒鐘后服務(wù)器就不那么忙了,可以繼續(xù)提供服務(wù),所以 503 響應(yīng)報(bào)文里通常還會(huì)有一個(gè)“Retry-After”字段,指示客戶(hù)端可以在多久以后再次嘗試發(fā)送請(qǐng)求。

小結(jié)

  1. 狀態(tài)碼在響應(yīng)報(bào)文里表示了服務(wù)器對(duì)請(qǐng)求的處理結(jié)果;
  2. 狀態(tài)碼后的原因短語(yǔ)是簡(jiǎn)單的文字描述,可以自定義;
  3. 狀態(tài)碼是十進(jìn)制的三位數(shù),分為五類(lèi),從 100 到 599;
  4. 2××類(lèi)狀態(tài)碼表示成功,常用的有 200、204、206;
  5. 3××類(lèi)狀態(tài)碼表示重定向,常用的有 301、302、304;
  6. 4××類(lèi)狀態(tài)碼表示客戶(hù)端錯(cuò)誤,常用的有 400、403、404;
  7. 5××類(lèi)狀態(tài)碼表示服務(wù)器錯(cuò)誤,常用的有 500、501、502、503。

課下作業(yè)

  1. 你在開(kāi)發(fā) HTTP 客戶(hù)端,收到了一個(gè)非標(biāo)準(zhǔn)的狀態(tài)碼,比如 4××、5××,應(yīng)當(dāng)如何應(yīng)對(duì)呢?
  2. 你在開(kāi)發(fā) HTTP 服務(wù)器,處理請(qǐng)求時(shí)發(fā)現(xiàn)報(bào)文里缺了一個(gè)必需的 query 參數(shù),應(yīng)該如何告知客戶(hù)端錯(cuò)誤原因呢?

歡迎你把自己的答案寫(xiě)在留言區(qū),與我和其他同學(xué)一起討論。如果你覺(jué)得有所收獲,歡迎你把文章分享給你的朋友。

分享到:
標(biāo)簽:響應(yīng) 狀態(tài)
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定