HTTP協議(超文本傳輸協議):是互聯網上應用最爲廣泛的一種網絡協議,所有的WWW文件都必須遵守這個標準。
1、客戶端發起一個HTTP請求,建立一個到服務器指定端口(默認80)的TCP連接。
2、服務器在那個端口監聽客戶端發來的請求。
3、服務器(向客戶端)發回一個狀態行,比如“HTTP/1.1 200 OK”和(響應的)消息,消息的消息體可能是請求的文件、錯誤消息、或者一些其他的信息。
4、客戶端接受服務器所返回的消息通過瀏覽器顯示在用戶的顯示屏上,然後客戶機與服務器斷開連接。
HTTP Request:客戶端通過發送HTTP請求向服務器請求對資源的訪問。它向服務器傳遞了一個數據塊,也就是請求信息,由請求行、請求頭、空行和請求體構成。一個HTTP請求報文分爲請求行、請求頭和請求體的結構如下圖:
一個典型的請求消息頭域,如下圖所示:
GET https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=http%E8%AF%B7%E6%B1%82%E4%BD%93%E6%9C%89%E5%93%AA%E4%BA%9B&rsv_pq=d99857fe0005b845&rsv_t=cb850GQJ1l2sbaZcfkUNDpxKzu5HaIzKXFFjln2W3KoTlAVcbXS83vJqTMc&rqlang=cn&rsv_enter=1&rsv_sug3=32&rsv_sug1=36&rsv_sug7=101 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: BAIDUID=62BF3FD39B99E1C1E09A2DCCBD06047B:FG=1; BIDUPSID=62BF3FD39B99E1C1E09A2DCCBD06047B; PSTM=1530629421; BD_UPN=12314353; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; ispeed_lsm=2; H_PS_PSSID=1437_21123_26810; BD_CK_SAM=1; PSINO=1; BD_HOME=0; H_PS_645EC=e271zsj86QRu6v%2BWp4xPjSXg0MeBr03EMXiwVRi%2BkP3G7cnsRW3d7cMEevg
一、Request Line:請求行
請求行分爲三個部分:請求方法、請求地址和協議及版本,以CRLF(\r\n)結束。
HTTP/1.1定義的請求方法有8中: GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE
最常見的是GET、POST
如果是RESTful接口一般會用到GET、POST、PUT、DELETE
二、Header:請求頭
Header | 解釋 | 示例 |
---|---|---|
Accept | 指定客戶端能夠接收的內容類型 | Accept: text/plain, text/html,application/json |
Accept-Charset | 瀏覽器可以接受的字符編碼集。 | Accept-Charset: iso-8859-5 |
Accept-Encoding | 指定瀏覽器可以支持的web服務器返回內容壓縮編碼類型。 | Accept-Encoding: compress, gzip |
Accept-Language | 瀏覽器可接受的語言 | Accept-Language: en,zh |
Accept-Ranges | 可以請求網頁實體的一個或者多個子範圍字段 | Accept-Ranges: bytes |
Authorization | HTTP授權的授權證書 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定請求和響應遵循的緩存機制 | Cache-Control: no-cache |
Connection | 表示是否需要持久連接。(HTTP 1.1默認進行持久連接) | Connection: close |
Cookie | HTTP請求發送時,會把保存在該請求域名下的所有cookie值一起發送給web服務器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 請求的內容長度 | Content-Length: 348 |
Content-Type | 請求的與實體對應的MIME信息 | Content-Type: application/x-www-form-urlencoded |
Date | 請求發送的日期和時間 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 請求的特定的服務器行爲 | Expect: 100-continue |
From | 發出請求的用戶的Email | From: [email protected] |
Host | 指定請求的服務器的域名和端口號 | Host: www.zcmhi.com |
If-Match | 只有請求內容與實體相匹配纔有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果請求的部分在指定時間之後被修改則請求成功,未被修改則返回304代碼 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果內容未改變返回304代碼,參數爲服務器先前發送的Etag,與服務器迴應的Etag比較判斷是否改變 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果實體未改變,服務器發送客戶端丟失的部分,否則發送整個實體。參數也爲Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在實體在指定時間之後未被修改才請求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通過代理和網關傳送的時間 | Max-Forwards: 10 |
Pragma | 用來包含實現特定的指令 | Pragma: no-cache |
Proxy-Authorization | 連接到代理的授權證書 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只請求實體的一部分,指定範圍 | Range: bytes=500-999 |
Referer | 先前網頁的地址,當前請求網頁緊隨其後,即來路 | Referer: http://www.zcmhi.com/archives... |
TE | 客戶端願意接受的傳輸編碼,並通知服務器接受接受尾加頭信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服務器指定某種傳輸協議以便服務器進行轉換(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
User-Agent | User-Agent的內容包含發出請求的用戶信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
Via | 通知中間網關或代理服務器地址,通信協議 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 關於消息實體的警告信息 | Warn: 199 Miscellaneous warning |
在請求頭,我們會發現每次訪問一個url都會產生一個Cookie,其結構大致如下:
BAIDUID=62BF3FD39B99E1C1E09A2DCCBD06047B:FG=1
BIDUPSID=62BF3FD39B99E1C1E09A2DCCBD06047B
PSTM=1530629421
BD_UPN=12314353
BDORZ=B490B5EBF6F3CD402E515D22BCDA1598
H_PS_PSSID=1437_21123_26810
BD_CK_SAM=1
PSINO=1
BD_HOME=0
H_PS_645EC=9573fbRzWf4F3tPBUuw17vxXaKvM306I%2FIpG1iZdjGKmcp5l%2Fl%2B1zhxmT60
ispeed_lsm=0
BDSVRTM=0
cookie一般是由Name(名稱)、Value(值)、Domain(域)、Path(路徑)、Expires/Max-Age(有效期)、Size(大小)、Http(控制cookie只能在http下才能被髮送)、Secure(控制cookie只能在https下才能被髮送)、SameSite(cookie在不同的站點之間是否被傳遞)三、Rquest Body:請求體(get請求的請求體一般沒有內容)
Types:根據應用場景,有三種不同的形式。
、 任意類型:移動開發者常見的,請求體是任意類型,服務器不會解析請求體,請求體的處理需要自己解析,如 POST JSON時候就是這類。
1、application/json:由於 JSON 規範的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什麼麻煩。
工作原理:
{
"name": "xiaoming",
"sub": [1, 2, 3],
"focus": [
{
"語文": 102,
"數學": 118,
"英語":121,
},
{
"hobby": 102,
"figures": "humorous",
"character":"outgoing"
}
]
}
2、Text/xml:一種使用 HTTP 作爲傳輸協議,XML 作爲編碼方式的遠程調用規範。
HTMLPOST http://www.example.com HTTP/1.1
Content-Type: text/xml
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><i4>41</i4></value>
</param>
</params>
</methodCall>
3、Query String:application/X-www-form-urlencoded
客戶端向服務器發送請求,其實瀏覽器已經爲我們做了這麼多事情!!!