HTTP詳解(二):HTTP報文格式

軟件 文章 大學 出神音樂 酷德思 2017-05-21

HTTP報文格式

HTTP詳解(二):HTTP報文格式

上一篇文章呢,主要是說了一下HTTP、TCP/IP和SOCKET的一些區別和聯繫,今天呢主要是和大家聊一聊HTTP報文的格式問題。HTTP報文這一塊,需要了解的點比較多,面試考察的點也很多,東西也很刁,所以需要花那麼點時間去理解。廢話不多說,咱們開始吧。

HTTP有兩種報文格式:

請求報文:由客戶端向服務器端發出的報文。

響應報文:從服務端到客戶端的報文。

我們呢,一個一個來說一下,先說請求報文。先看一下大學期間比較熟悉的一張圖

HTTP詳解(二):HTTP報文格式

請求報文:

我們先從最右邊開始看,可以看出來,HTTTP請求報文由三部分構成,分別是:請求行、請求頭、請求實體。當然,嚴格意義上來說,應該還包括空行。


請求行:

首先,為什麼要用請求行?

其實,請求航的存在其主要目的就是為了區分報文是請求報文還是響應報文,以及記錄相應的URL以及協議版本。可以看出,請求行主要由三部分構成:方法、請求資源的URL、HTTP的版本。其中URL和版本無須多說,咱們主要說一下“方法”;

HTTP請求的方法主要有:GET、POST、PUT、DELETE、OPTIONS、HEAD、TRANCE、CONNECT等

其中,最常用的是GET和POST請求,但是我們都來了解一下。

GET:想特定的資源發出請求。

POST:向指定的資源提交相應的數據金星煥處理請求,比如說提交表單、上傳文件。數據被包含在請求實體中。

PUT:從客戶端向服務器傳送的數據取代指定的文檔的內容。

DELETE:請求服務器刪除指定的頁面

OPTIONS:允許客戶端查看服務器的性能。

HEAD:類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭

TRANS:回顯服務器收到的請求,主要用於測試或診斷。

CONNECT:HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。

我們重點來說一下GET和POST方法。

1、GET請求,請求的數據會附在URL後面,已key=value(參數名=參數值)的形式傳遞,具體例子:http://localhost:8888/abc/login.jsp?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD,在這裡有一點十分的重要:GET請求中的參數用“?”分割URL實體和傳遞參數,而參數之間用“&”進行分割。其中,如果傳輸的數據是英文字母或者數據,則原樣發送;如果時空格,轉換成“+”;如果是中文或者其他的字符,則直接把傳輸的數用BASE64加密,轉換成十六進制輸出,比如後面的%E4%BD%A0%E5%A5%BD就是16進制的輸出。

POST請求,則是把提交的數據放在HTTP請求實體中。

2、GET請求最大長度是有限制的,可能有一種說法是GET請求傳遞參數的最大長度是1024KB,其實這種說法是不準確的。實際中,URL並不存在參數上限的限制,HTTP規範裡面也並沒有對URL的長度進行限制。而這個限制主要是來自瀏覽器和服務器。比如IE6.0瀏覽器所支持的最大長度的URL長度是2083KB,firefox 3.0.3瀏覽器所支持的最大長度是7764KB.

POST請求傳遞的數據是沒有大小限制的,HTTP規範中也沒有對其進行相應的限制。只不過是處理器的處理能力限制了它。

一般來說,GET請求傳遞的數據大小要小於POST傳遞數據的大小。

3、POST的安全性要比GET請求的安全性要高一些。因為GET請求傳遞的參數是後綴在URL後面的,可以直接看到,所以安全性較POST請求安全性會差一些!

我們來看一下具體請求報文示例:

其中第一行就是請求行,上圖中“GET”代表著請求的方法為GET請求,HTTP/1.1 代表這使用的HTTP協議的版本,中間代表著URL。


請求頭:

1、請求頭的作用:請求頭是用來通知服務器有關客戶端請求的一些信息。

2:請求頭的格式:請求頭由關鍵字/值對構成,每行一對。關鍵字和值用英文冒號“:”隔開,值對之間用英文逗號","隔開。

比如上圖中:Accept、Host、User-Agent等等都是請求頭中關鍵字。

我們來了解幾個比較重要的請求頭中屬性,後期我們會有專門的一篇文章去介紹HTTP 報文的頭部。

Accept:指定客戶端能夠接收的內容類型 示例:Accept: text/plain, text/html

Cookie:HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。 示例:Cookie: $Version=1; Skin=new;

Content-Type:顯示HTTP提交的內容類型,一般來說POST請求會設置這個屬性 示例:Content-Type: application/x-www-form-urlencoded

請求實體:

請求實體作用:用來傳輸具體數據報文

請求頭和請求正文之間會有一個空行,這個空行非常的重要,主要是用來告訴服務器端請求頭已經結束了,接下來的是請求正文啦!具體見下圖。

上圖中的“txtName=123&txtPwd=123”就是具體的請求報文。


響應報文:

嚴格意義上將,響應報文由四部分構成:狀態行、響應頭、空行、響應正文構成。

其中狀態行由3部分構成,分別是協議版本、狀態碼、狀態描述,之間由空格構成。

對於,我們開發人員來說,狀態行中可能最重要的就是狀態碼,不同狀態碼能表示出此次請求的狀態。

狀態碼由三位數字組成,其中200~299代表著成功,300~399代表著資源重定向,400~499代表客戶端請求錯誤,500~599表示服務器端出錯。

其中呢,有幾個狀態碼是比較常見,比較重要的,上圖!

HTTP詳解(二):HTTP報文格式

響應頭部:

與請求頭部是類似的,它是用來告訴客戶端響應報文的一些相關信息的。前面我們已經大致的講述了請求頭,響應頭部我們就直接上圖吧。

響應頭說明
Server服務器應用程序軟件的名稱和版本
Content-Type響應正文的類型(是圖片還是二進制字符串)
Content-Length響應正文長度
Content-Charset響應正文使用的編碼
Content-Encoding響應正文使用的數據壓縮格式
Content-Language響應正文使用的語言

響應正文:

用來傳輸響應數據,跟請求實體是類似的,在這裡就不贅述了。

好了,今天的"HTTP報文格式"就說到這,感謝大家抽出時間來閱讀我的文章,辛苦了!下一篇咱們從代碼層次上去實現一下HTTP傳輸數據。

感謝大家抽出時間閱讀我的文章,辛苦啦!

如果大家覺得我的文章不錯,請關注我的微信公眾號--酷德思。

相關推薦

推薦中...