程序猿必須要瞭解的HTTP協議,今天總結了一份關於HTTP請求的結構與具體內容

        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
AuthorizationHTTP授權的授權證書Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control指定請求和響應遵循的緩存機制Cache-Control: no-cache
Connection表示是否需要持久連接。(HTTP 1.1默認進行持久連接)Connection: close
CookieHTTP請求發送時,會把保存在該請求域名下的所有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發出請求的用戶的EmailFrom: [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如果實體未改變,服務器發送客戶端丟失的部分,否則發送整個實體。參數也爲EtagIf-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-AgentUser-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

        

        客戶端向服務器發送請求,其實瀏覽器已經爲我們做了這麼多事情!!!

        

       


        

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章