Java面試HTTP篇之一:HTTP協(xié)議
一、技術(shù)基石及概述
問(wèn):什么是HTTP?
答:HTTP是一個(gè)客戶端和服務(wù)器端請(qǐng)求和響應(yīng)的標(biāo)準(zhǔn)TCP。其實(shí)建立在TCP之上的。
當(dāng)我們打開(kāi)百度網(wǎng)頁(yè)時(shí),是這樣的:
https://www.baidu.com
多了個(gè)S,其實(shí)S表示TLS、SSL。在這里不做解釋,因此HTTP的技術(shù)基石如圖所示:
那HTTP協(xié)議呢?HTTP協(xié)議(HyperText Transfer Protocol),即超文本傳輸協(xié)議是用于服務(wù)器傳輸?shù)娇蛻舳藶g覽器的傳輸協(xié)議。Web上,服務(wù)器和客戶端利用HTTP協(xié)議進(jìn)行通信會(huì)話。有OOP思想的得出結(jié)論:其會(huì)話的結(jié)構(gòu)是一個(gè)簡(jiǎn)單的請(qǐng)求/響應(yīng)序列,即瀏覽器發(fā)出請(qǐng)求和服務(wù)器做出響應(yīng)。
二、深入理解技術(shù)基石和工作流程
既然HTTP是基于傳輸層的TCP協(xié)議,而TCP協(xié)議是面向連接的端到端的協(xié)議。因此,使用HTTP協(xié)議傳輸前,首先建立TCP連接,就是因此在談的TCP鏈接過(guò)程的“三次握手”。如圖
在Web上,HTTP協(xié)議使用TCP協(xié)議而不是UDP協(xié)議的原因在于一個(gè)網(wǎng)頁(yè)必須傳送很多數(shù)據(jù),而且保證其完整性。TCP協(xié)議提供傳輸控制,按順序組織數(shù)據(jù)和錯(cuò)誤糾正的一系列功能。
一次HTTP操作稱為一個(gè)事務(wù),其工作過(guò)程可分為四步:
1、客戶端與服務(wù)器需要建立連接。(比如某個(gè)超級(jí)鏈接,HTTP就開(kāi)始了。)
2、建立連接后,發(fā)送請(qǐng)求。
3、服務(wù)器接到請(qǐng)求后,響應(yīng)其響應(yīng)信息。
4、客戶端接收服務(wù)器所返回的信息通過(guò)瀏覽器顯示在用戶的顯示屏上,然后客戶機(jī)與服務(wù)器斷開(kāi)連接。
建立連接,其實(shí)建立在TCP連接基礎(chǔ)之上。圖解核心工作過(guò)程(即省去連接過(guò)程)如下:
三、詳解工作過(guò)程的HTTP報(bào)文
HTTP報(bào)文由從客戶機(jī)到服務(wù)器的請(qǐng)求和從服務(wù)器到客戶機(jī)的響應(yīng)構(gòu)成。
一、請(qǐng)求報(bào)文格式如下:
- 請(qǐng)求行
- 通用信息頭
- 請(qǐng)求頭
- 實(shí)體頭
- (空行)
- 報(bào)文主體
如圖,請(qǐng)求我博客一篇文章時(shí)發(fā)送的報(bào)文內(nèi)容:
對(duì)于其中請(qǐng)求報(bào)文詳解:
1、請(qǐng)求行 方法字段 + URL + Http協(xié)議版本
2、通用信息頭 Cache-Control頭域:指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制。 keep-alive 是其連接持續(xù)有效【在下面百度的例子,會(huì)得到驗(yàn)證】
3、請(qǐng)求頭 Host頭域,腦補(bǔ)吧 Referer頭域:允許客戶端指定請(qǐng)求URL的資源地址。 User-Agent頭域:請(qǐng)求用戶信息?!究梢钥闯鲆恍┛蛻舳藶g覽器的內(nèi)核信息】
4、報(bào)文主體 如圖中的 “ p=278 ”一般來(lái)說(shuō),請(qǐng)求主體少不了請(qǐng)求參數(shù)。
二、應(yīng)答報(bào)文格式如下:
狀態(tài)行 通用信息頭 響應(yīng)頭 實(shí)體頭 (空行) 報(bào)文主體
如圖,就是這篇博客響應(yīng)的內(nèi)容:
對(duì)其中響應(yīng)報(bào)文詳解:
1、狀態(tài)行 HTTP協(xié)議版本 + 狀態(tài)碼 + 狀態(tài)代碼的文本描述 【比如這里,200 代表請(qǐng)求成功】
2、通用信息頭 keep-alive 是其連接持續(xù)有效【在下面百度的例子,會(huì)得到驗(yàn)證】 Date頭域:時(shí)間描述
3、響應(yīng)頭 Server頭:處理請(qǐng)求的原始服務(wù)器的軟件信息。
4、實(shí)體頭 Content-Type頭:便是接收方實(shí)體的介質(zhì)類型。(這也表示了你的報(bào)文主體是什么。)
(空行)
5、報(bào)文主體 這里就是HTML響應(yīng)頁(yè)面了,在截圖tab頁(yè)中的response中可查看。
一次簡(jiǎn)單的請(qǐng)求/響應(yīng)就完成了。
三、HTTP協(xié)議知識(shí)補(bǔ)充
請(qǐng)求報(bào)文相關(guān):
請(qǐng)求行-請(qǐng)求方法
- GET 請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源
- POST 在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)
- HEAD 請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭
- PUT 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)
- DELETE 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源
- TRACE 請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷
- CONNECT 保留將來(lái)使用
- OPTIONS 請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求
響應(yīng)報(bào)文相關(guān):
響應(yīng)行-狀態(tài)碼
- 1xx:指示信息--表示請(qǐng)求已接收,繼續(xù)處理
- 2xx:成功--表示請(qǐng)求已被成功接收、理解、接受
- 3xx:重定向--要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
- 4xx:客戶端錯(cuò)誤--請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
- 5xx:服務(wù)器端錯(cuò)誤--服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
常見(jiàn)的狀態(tài)碼
200 OK 請(qǐng)求成功(其后是對(duì)GET和POST請(qǐng)求的應(yīng)答文檔。) 304 Not Modified 未按預(yù)期修改文檔??蛻舳擞芯彌_的文檔并發(fā)出了一個(gè)條件性的請(qǐng)求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來(lái)緩沖的文檔還可以繼續(xù)使用。 404 Not Found 服務(wù)器無(wú)法找到被請(qǐng)求的頁(yè)面。 500 Internal Server Error 請(qǐng)求未完成。服務(wù)器遇到不可預(yù)知的情況。
比如304
1、304狀態(tài)碼:有些圖片和js文件在本地客戶端緩存,再次請(qǐng)求后,緩存的文件可以使用。
2、以上所以HTTP請(qǐng)求,只靠一個(gè)TCP連接,這就是所謂的持久連接。
四、關(guān)于HTTP協(xié)議的Web應(yīng)用框架或者規(guī)范
JavaEE的人會(huì)知道Servlet規(guī)范。其中Web應(yīng)用容器都實(shí)現(xiàn)了HTTP協(xié)議中的對(duì)象,即請(qǐng)求和響應(yīng)對(duì)象。比如 javax.servlet.http.HttpServletResponse 對(duì)象中肯定有對(duì)狀態(tài)碼描述,如圖
至于如何使用它們,坐等系列文章吧。
五、總結(jié)
回顧全文,HTTP協(xié)議其實(shí)就是我們對(duì)話一樣,語(yǔ)言就是其中的協(xié)議。所以掌握HTTP協(xié)議明白以下幾點(diǎn)就好:
1、用什么通過(guò)HTTP協(xié)議通信
2、怎么通過(guò)HTTP協(xié)議通信
【本文為51CTO專欄作者“李強(qiáng)強(qiáng)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)51CTO聯(lián)系作者獲取授權(quán)】