HTTP基礎(chǔ)知識整理

1. HTTP請求報文格式

HTTP請求報文分為三部分:請求行、請求頭請求體

注:部分文章也將HTTP請求報文分為兩部分:請求頭請求體

1.1 請求行

請求行(Request Line)分為三個部分:請求方法、請求地址協(xié)議版本,以CRLF(rn)結(jié)束。

HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST,如果是RESTful接口的話一般會用到GET、POST、DELETE、PUT。(GET方法是默認(rèn)的請求方法,用來請求訪問URI所指定的資源,并不對服務(wù)器上的內(nèi)容產(chǎn)生熱喝作用結(jié)果;POST方法用來傳輸實(shí)體主體,目的并不是獲取響應(yīng)的主體內(nèi)容,POST方法是把內(nèi)容放在報文內(nèi)容中,只要報文內(nèi)容沒有限制,它的大小就沒有限制。)

請求地址由四部分組成:protocol[協(xié)議]、host[主機(jī)]、path[路徑]、Query String[參數(shù)],例如:

http[protocol]://localhost[host]/index.html[path]?key1=value1&key2=value2[Query String]

1.2 請求頭 Request Headers

請求頭可用于傳遞一些附加信息,格式: 鍵: 值,注意冒號后面有一個空格!例如:

Accept:image/gif.image/jpeg.*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate.

詳見3. Header

1.3 請求體

請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經(jīng)結(jié)束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:

username=Bill&password=KillBill

在以上的例子的HTTP請求中,請求的正文只有一行內(nèi)容。當(dāng)然,在實(shí)際應(yīng)用中,HTTP請求正文可以包含更多的內(nèi)容。

根據(jù)應(yīng)用場景的不同,HTTP請求的請求體有三種不同的形式:

第一種:移動開發(fā)者常見的,請求體是任意類型,服務(wù)器不會解析請求體,請求體的處理需要自己解析,如Post Json時候。

第二種:第二種和第三種都有固定格式的,屬于形式二,是服務(wù)器端開發(fā)人員最先了解到的兩種。這里的格式要求就是URL中Query String的格式要求:多個鍵值對之間用&連接,鍵與值之前用=連接,且只能用ASCII字符,非ASCII字符需使用UrlEncode編碼。

第三種:第三種請求體的請求體被分成為多個部分,文件上傳時會被使用,這種格式最先應(yīng)該是被用于郵件傳輸中,每個字段/文件都被boundary(Content-Type中指定)分成單獨(dú)的段,每段以-- 加 boundary開頭,然后是該段的描述頭,描述頭之后空一行接內(nèi)容,請求結(jié)束的標(biāo)制為boundary后面加--,結(jié)構(gòu)見下圖:

第四種:區(qū)分是否被當(dāng)成文件的關(guān)鍵是Content-Disposition是否包含filename,因為文件有不同的類型,所以還要使用Content-Type指示文件的類型,如果不知道是什么類型取值可以為application/octet-stream表示該文件是個二進(jìn)制文件,如果不是文件則Content-Type可以省略。下圖為一個帶有文件的上傳的請求體原文:

注:第二、三種請求體需求配合特定的Content-Type請求頭,如:第二種配合Content-Type:application/x-www-form-urlencoded;第三種配合Content-Type: multipart/form-data; boundary={boundary} ,*上面的form-data也可以是mixed、alternative、digest、parallel,但我只用到了form-data;如果兩者沒有相配合,那么服務(wù)器不會解析請求體,也就是說只會當(dāng)成第一種情況!表單或者模擬表單 指的就是第二種和第三種(multipart/form-data)

2. HTTP響應(yīng)報文格式

HTTP響應(yīng)報文分為三部分:響應(yīng)行(狀態(tài)行)、響應(yīng)頭響應(yīng)體

2.1 狀態(tài)行

狀態(tài)行由四部分組成:協(xié)議版本、狀態(tài)碼狀態(tài)碼描述,以CRLF(rn)結(jié)束。

狀態(tài)碼詳細(xì)可以查看HTTP狀態(tài)碼詳解

2.2 Response Headers和Request Headers相同,見下文

2.3 響應(yīng)體

3. Header

Header可用于傳遞一些附加信息,格式: 鍵: 值,注意冒號后面有一個空格!

3.1 請求和響應(yīng)常見通用Header

Content-Type:請求體/響應(yīng)體的類型,如:text/plain、application/json

Accept:說明接收的類型,可以多個值,用,(半角逗號)分開

Content-Length:請求體/響應(yīng)體的長度,單位字節(jié)

Content-Encoding:請求體/響應(yīng)體的編碼格式,如gzip,deflate

Accept-Encoding:告知對方我方接受的Content-Encoding

ETag:給當(dāng)前資源的標(biāo)識,和Last-Modified、If-None-Match、If-Modified-Since配合,用于緩存控制

Cache-Control:取值為一般為no-cache或max-age=XX,XX為個整數(shù),表示該資源緩存有效期(秒)

3.2 常見請求Header

Authorization:用于設(shè)置身份認(rèn)證信息

User-Agent:用戶標(biāo)識,如:OS和瀏覽器的類型和版本

If-Modified-Since:值為上一次服務(wù)器返回的 Last-Modified 值,用于確認(rèn)某個資源是否被更改過,沒有更改過(304)就從緩存中讀取

If-None-Match:值為上一次服務(wù)器返回的 ETag 值,一般會和If-Modified-Since一起出現(xiàn)

Cookie:已有的Cookie

Referer:表示請求引用自哪個地址,比如你從頁面A跳轉(zhuǎn)到頁面B時,值為頁面A的地址

Host:請求的主機(jī)和端口號

3.3 常見響應(yīng)Header

Date:服務(wù)器的日期

Last-Modified:該資源最后被修改時間

Transfer-Encoding:取值為一般為chunked,出現(xiàn)在Content-Length不能確定的情況下,表示服務(wù)器不知道響應(yīng)版體的數(shù)據(jù)大小,一般同時還會出現(xiàn)Content-Encoding響應(yīng)頭

Set-Cookie:設(shè)置Cookie

Location:重定向到另一個URL,如輸入瀏覽器就輸入baidu.com回車,會自動跳到 https://www.baidu.com ,就是通過這個響應(yīng)頭控制的

Server:后臺服務(wù)器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容