請求報文和響應報文都是由以下4部分組成:
1.請求行/響應行
2.請求頭/響應頭
3.空行
4.消息主體(請求體/響應體)
請求報文結構
請求行
格式為:Method Request-URI HTTP-Version 結尾符
結尾符一般用\r\n
根據HTTP標准,HTTP請求可以使用多種請求方法。
序號 |
方法 |
描述 |
1 |
GET |
請求指定的頁面信息,並返回實體主體。 |
2 |
HEAD |
類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 |
3 |
POST |
向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求主體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。 |
4 |
PUT |
從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
5 |
DELETE |
請求服務器刪除指定的頁面。 |
6 |
CONNECT |
HTTP/1.1協議中預留給能夠將連接改為管道方式的代理服務器。 |
7 |
OPTIONS |
允許客戶端查看服務器的性能。 |
8 |
TRACE |
回顯服務器收到的請求,主要用於測試或診斷。 |
請求頭
通用頭:
既可以出現在請求報頭,也可以出現在響應報頭中
Date:表示消息產生的日期和時間
Connection:允許發送指定連接的選項,例如指定連接是連續的,或者指定“close”選項,通知服務器,在響應完成后,關閉連接
Cache-Control:用於指定緩存指令,緩存指令是單向的(響應中出現的緩存指令在請求中未必會出現),且是獨立的(一個消息的緩存指令不會影響另一個消息處理的緩存機制)
請求頭:
請求報頭通知服務器關於客戶端請求的信息,典型的請求頭有:
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機
User-Agent:發送請求的瀏覽器類型、操作系統等信息
Accept:客戶端可識別的內容類型列表,用於指定客戶端接收那些類型的信息
Accept-Encoding:客戶端可識別的數據編碼
Accept-Language:表示瀏覽器所支持的語言類型
Connection:允許客戶端和服務器指定與請求/響應連接有關的選項,例如這是為Keep-Alive則表示保持連接。
Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式。
實體頭:
實體報頭用來定義被傳送資源的信息,既可以用於請求也可用於響應。請求和響應消息都可以傳送一個實體,常見的實體報頭為:
Content-Type:發送給接收者的實體正文的媒體類型。HTTP content-type 對照表
Content-Lenght:實體正文的長度
Content-Language:描述資源所用的自然語言,沒有設置則該選項則認為實體內容將提供給所有的語言閱讀
Content-Encoding:實體報頭被用作媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應的解碼機制。
Last-Modified:實體報頭用於指示資源的最后修改日期和時間
Expires:實體報頭給出響應過期的日期和時間
注意:
Content-Type和Content-Encoding用於定義網絡文件的類型和網頁的編碼,決定瀏覽器將以什么形式、什么編碼讀取這個文件。
Accept-Encoding 和Content-Encoding是HTTP中用來對采用哪種編碼格式傳輸正文進行協定的一對頭部字段。工作原理如下:
1.首先瀏覽器(也就是客戶端)發送請求時,通過Accept-Encoding帶上自己支持的內容編碼格式列表;
2.服務端在接收到請求后,從中挑選出一種用來對響應信息進行編碼,並通過Content-Encoding來說明服務端選定的編碼信息;
3.瀏覽器在拿到響應正文后,依據Content-Encoding進行解壓。服務端也可以返回未壓縮的正文,但這種情況不允許返回Content-Encoding.
空行
http協議規定的格式,一般采用\r\n
消息主體
一般用於http的post方法,通過實體報頭Content-Type規定消息主體的格式內容。
普通post請求頭中Content-Type字段值為:
Content-Type: application/x-www-form-urlencoded
上傳有文件控件的表單的請求頭中Content-Type字段值要添加 boundary=${bound}(${bound}規定了請求體中的內容分隔符)。
Content-Type:multipart/form-data;boundary=----WebKitFormBoundaryZpsWTsOiRHI0TBW7
multipart/form-data:
1. 該格式是post的常見提交方式,它會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件;
2. Content-Disposition,用來說明字段的一些信息;當上傳的字段是文件時,會有Content-Type來表名文件類型;
3. 所有的數據請求頭和數據之間都用\r\n\r\n分開,兩個數據間用 ----${bound}\r\n分開。
4. 請求體最后添加----${bound}\r\n
------WebKitFormBoundaryjUVXJ3PslTEBh9as Content-Disposition: form-data; name="param1" AAAA ------WebKitFormBoundaryjUVXJ3PslTEBh9as Content-Disposition: form-data; name="param2"
123456
------WebKitFormBoundaryjUVXJ3PslTEBh9as Content-Disposition: form-data; name="fileparam"; filename="test.txt" Content-Type: text/plain contents of file
------WebKitFormBoundaryjUVXJ3PslTEBh9as
響應報文結構
響應行
響應行一般由協議版本、狀態碼及其描述組成 比如 HTTP/1.1 200 OK
HTTP狀態碼:
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的服務器會返回一個包含HTTP狀態碼Status Code的響應頭(server header)用以響應瀏覽器的請求。
下面是常見的HTTP狀態碼:
200 - 請求成功
301 - 資源(網頁等)被永久轉移到其它URL
404 - 請求的資源(網頁等)不存在
500 - 內部服務器錯誤
HTTP狀態碼由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,HTTP狀態碼共分為5種類型:
①1** 信息,服務器收到請求,需要請求者繼續執行操作;
②2** 成功,操作被成功接收並處理;
③3** 重定向,需要進一步的操作以完成請求;
④4** 客戶端錯誤,請求包含語法錯誤或無法完成請求;
⑤5** 服務器錯誤,服務器在處理請求的過程中發生了錯誤。
響應頭
響應頭:
用於服務器傳遞自身信息的響應,常見的響應報頭:
Allow:服務器支持哪些請求方法(如GET、POST等)。
Location:用於重定向接受者到一個新的位置,常用在更換域名的時候
Server:包含可服務器用來處理請求的系統信息,與User-Agent請求報頭是相對應的
Transfer-Encoding:告訴瀏覽器數據的傳送格式。
Refresh:告訴瀏覽器隔多久刷新一次,以秒計。
Set-Cookie:設置和頁面關聯的Cookie。
Access-Control-Allow-Origin:指定哪些站點可以參與跨站資源共享。
Age:對象在代理緩存中暫存的秒數。
參考:https://blog.csdn.net/shouwang666666/article/details/70232053