整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTTP 報文詳解

          HTTP 報文詳解

          T+技術學習視頻資源,500+技術電子書,大量高效工具及網站,私信回復【資源】即可免費獲取


          HTTP 報文是在應用程序之間發(fā)送的數據塊,這些數據塊將通過以文本形式的元信息開頭,用于 HTTP 協議交互。請求端(客戶端)的 HTTP 報文叫做請求報文,響應端(服務器端)的叫做響應報文。 HTTP 報文本身是由多行(用 CR+LF 作換行符)數據構成的字符串文本。

          請求報文

          HTTP 請求報文由請求行請求頭空行請求包體(body)組成。如下圖所示:

          真實示例:

          GET / HTTP/1.1     
          Host: www.baidu.com
          Connection: keep-alive
          Cache-Control: max-age=0
          sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
          sec-ch-ua-mobile: ?0
          sec-ch-ua-platform: "macOS"
          Upgrade-Insecure-Requests: 1
          User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
          Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
          Sec-Fetch-Site: none
          Sec-Fetch-Mode: navigate
          Sec-Fetch-User: ?1
          Sec-Fetch-Dest: document
          Accept-Encoding: gzip, deflate, br
          Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
          Cookie: BIDUPSID=8B0207CE0B6364E5934651E84F17999B; PSTM=1619707475; 

          1.請求行

          主要描述了客戶端想要如何操作服務端的資源;請求行由三部分構成:

          • 請求方法:表示對資源期望進行何種操作,常用的如 GET、POST
          • 請求目標:通常是一個 URL ,表明了要操作的資源。
          • 版本號:表示報文使用的 HTTP 協議版本。

          這三個部分通常使用空格(space)來分隔,最后要用 CRLF 換行表示結束。

          GET / HTTP/1.1  

          這個請求行,結合之前的描述,意思就是“服務端妹子你好,我是客戶端蛋蛋,現在我想獲取網站根目錄的默認信息,我這邊用的協議版本是 1.1,麻煩你也要用這個版本回復我哦”

          2.請求頭

          HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的信息。與緩存相關的規(guī)則信息,均包含在header中,請求頭可大致分為四種類型:通用首部字段、請求首部字段、響應首部字段、實體首部字段。這里先簡單羅列,稍后做具體解釋。

          3.請求體

          請求體就是 HTTP 要傳輸的內容,HTTP 可以承載很多類型的數字數據:圖片、音頻、視頻、HTML 文檔等。

          • 介紹響應報文
          • 首部字段
          • 介紹功能

          響應報文

          HTTP 響應報文由狀態(tài)行響應頭部空行響應包體(body)組成。如下圖所示:

          以請求 www.baidu.com為例:

          HTTP/1.1 200 OK
          Bdpagetype: 1
          Bdqid: 0xfb0d743100040ad2
          Cache-Control: private
          Connection: keep-alive
          Content-Encoding: gzip
          Content-Type: text/html;charset=utf-8
          Date: Fri, 24 Dec 2021 08:20:44 GMT
          Expires: Fri, 24 Dec 2021 08:20:44 GMT
          Server: BWS/1.1
          Set-Cookie: BDSVRTM=17; path=/
          Set-Cookie: BD_HOME=1; path=/
          Set-Cookie: H_PS_PSSID=35635_34439_35104_35628_35488_35436_35456_34584_35491_35584_35586_34873_35317_26350_35610_35562; path=/; domain=.baidu.com
          Strict-Transport-Security: max-age=172800
          Traceid: 1640334044050133761018090243032019634898
          X-Frame-Options: sameorigin
          X-Ua-Compatible: IE=Edge,chrome=1
          Transfer-Encoding: chunked

          1.狀態(tài)行

          狀態(tài)行包含了 協議版本狀態(tài)碼以及狀態(tài)描述

          • 協議版本:指明了報文使用的 HTTP 協議版本
          • 狀態(tài)碼:狀態(tài)碼是一個三位數字,用來表示處理的結果,下面列出了狀態(tài)碼的類別:
          • 狀態(tài)描述:這個是作為狀態(tài)碼的補充,是一段更詳細的文字,幫助人們理解原因。

          2.響應頭部

          和請求報文的請求頭類似,響應頭也由鍵值對組成,每行一對,鍵和值用英文冒號 : 分隔。響應頭域允許服務器傳遞不能放在狀態(tài)行的附加信息,這些域主要描述服務器的信息和Request-URI進一步的信息

          3.響應包體

          服務器返回給瀏覽器的響應信息,響應數據的格式是根據服務器來的,常見的響應數據格式有:text/html、application/json等。

          常見的響應格式:

          HTTP 首部字段

          在 HTTP 的請求頭和響應頭中都是由首部字段來表示的,首部內容可以為客戶端和服務器分別處理請求和響應提供所需要的信息。

          首部字段可以分為通用首部字段請求首部字段響應首部字段實體首部字段

          通用首部字段

          通用首部字段是指請求報文和響應報文都會使用到的首部字段。

          先來看下都有哪些字段:

          Cache-Control

          通過指定 Cache-Control 的指令,就能操作緩存的工作機制。

          一般在客戶端和服務端之間還存在一個緩存服務器,如果請求的資源在緩存服務器中有,就不會再請求源服務器,提高了請求響應的效率。

          指令的參數可以多選,通過“,”分隔。

          Cache-Control: private, max-age=0, no-cache

          public 指令

          Cache-Control: public

          當使用 public 指令時,明確表明其他用戶也可以利用緩存。

          private 指令

          Cache-Control: private

          當指定 private 指令后,響應只以特定的用戶作為對象,這與 public 指令的行為相反。

          緩存服務器會對該特定用戶提供資源緩存的服務,對于其他用戶發(fā)送過來的請求,代理服務器則不會返回緩存。

          no-cache 指令

          Cache-Control: no-cache

          使用 no-cache 指令可以防止從緩存中拿過期的數據。

          在請求中如果包含該指令,則客戶端將不會接收緩存過的響應,中間的緩存服務器會把請求轉發(fā)給源服務器。

          如果響應中包含該指令,緩存服務器會向源服務器進行資源有效期的確認,如果是過期的資源則不緩存。

          no-store 指令

          Cache-Control: no-store

          該指令規(guī)定緩存不能在本地存儲請求或響應的任一部分。這里我們要和上面那個 no-cache 指令要區(qū)分開,no-store才是真正不進行緩存,no-cache 只是不對過期的資源進行緩存。

          Connection

          Connection 有兩個作用:控制不再轉發(fā)給代理的首部字段、管理持久連接。

          • 控制不再轉發(fā)給代理的首部字段Connection: 不再轉發(fā)的首部字段名
          • 管理持久連接
          Connection: close

          當服務器端想明確斷開連接時,則指定 Connection 首部字段的值為 Close。

          Date

          首部字段 Date 表明創(chuàng)建 HTTP 報文的日期和時間。

          Trailer

          首部字段 Trailer 會事先說明在報文主體后記錄了哪些首部字段。該首部字段可應用在 HTTP/1.1 版本分塊傳輸編碼時。

          Transfer-Encoding

          該字段規(guī)定了傳輸報文主體時采用的編碼方式。 HTTP/1.1 的傳輸編碼方式僅對分塊傳輸編碼有效。

          請求首部字段

          請求首部字段是從客戶端往服務器端發(fā)送請求報文中所使用的字段,用于補充請求的附加信息、客戶端信息、對響應內容相關的優(yōu)先級等內容。

          常用字段具體說明

          Accept

          Accept: text/html,application/xhtml+xml,application/xml;q=0.3

          該字段可以通知服務器 客戶端能夠接收處理的媒體類型及優(yōu)先級。

          比如,如果瀏覽器不支持 PNG 圖片的顯示,那 Accept 就不指定 image/png ,而指定可處理的 image/gif 和 image/jpeg 等圖片類型。 若想要給顯示的媒體類型增加優(yōu)先級,則使用 q=來額外表示權重值。用分號(;)進行分隔。權重值 q 的范圍是 0~1(可精確到小數點 后 3 位),且 1 為最大值。不指定權重 q 值時,默認權重為 q=1.0。

          Accept-Charset

          Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

          通知服務器 客戶端支持的字符集及字符集的相對優(yōu)先順序。

          Accept-Encoding

          Accept-Encoding: gzip, deflate

          首部字段用來告知服務器 客戶端支持的內容編碼及內容編碼的優(yōu)先級順序。可一次性指定多種內容編碼。

          Accept-Language

          Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

          用來告知服務器 客戶端能夠處理的自然 語言集(指中文或英文等),以及自然語言集的相對優(yōu)先級。可一次 指定多種自然語言集。

          Authorization

          Authorization: Basic dWVub3NlbjpwYXNzd29yZA==

          首部字段 Authorization 是用來告知服務器,客戶端的認證信息(證書值)。

          User-Agent

          User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0)

          首部字段 User-Agent 會將創(chuàng)建請求的瀏覽器和用戶代理名稱等信息傳 達給服務器。

          由網絡爬蟲發(fā)起請求時,有可能會在字段內添加爬蟲作者的電子郵件地址。此外,如果請求經過代理,那么中間也很可能被添加上代理服務器的名稱。

          響應首部字段

          響應首部字段是由服務器端向客戶端返回響應報文中所使用的字段,用于補充響應的附加信息、服務器信息,以及對客戶端的附加要求等信息。

          Accept-Ranges

          Accept-Ranges: bytes    當不能處理范圍請求時,Accept-Ranges: none

          用來告知客戶端服務器是否能處理范圍請 求,以指定獲取服務器端某個部分的資源。

          Age

          Age: 600

          Age 能告知客戶端,源服務器在多久前創(chuàng)建了響應。字段值的單位為秒。

          Location

          Location: http://www.usagidesign.jp/sample.html

          該字段可以將響應接收方引導至某個與請求 URI 位置 不同的資源。

          基本上,該字段會配合 3xx :Redirection 的響應,提供重定向的 URI。

          Retry-After

          Retry-After: 120

          告知客戶端應該在多久之后再次發(fā)送請求。主要 配合狀態(tài)碼 503 Service Unavailable 響應,或 3xx Redirect 響應一起使 用。

          Server

          Server: Apache/2.2.17 (Unix)

          告知客戶端當前服務器上安裝的 HTTP 服務器應用程序的信息。

          實體首部字段

          實體首部字段是包含在請求報文和響應報文中的實體部分所使用的首部,用于補充內容的更新時間等與實體相關的信息。

          Allow

          Allow: GET, HEAD

          用于通知客戶端能夠支持 Request-URI 指定資源的所有 HTTP 方法。

          Content-Encoding

          Content-Encoding: gzip

          會告知客戶端服務器對實體的主體部分選用的內容編碼方式。

          Content-Language

          Content-Language: zh-CN

          首部字段 Content-Language 會告知客戶端,實體主體使用的自然語言。

          Content-Length

          Content-Length: 15000

          表明了實體主體部分的大小(單位是字 節(jié))。

          Content-Type

          Content-Type: text/html; charset=UTF-8

          說明了實體主體內對象的媒體類型。

          網絡安全在我身邊##職場面試#

          經過這一段時間的學習,我們已經學習了HTTP的基礎知識。今天,小唐將會帶領大家正式的開始學習有關HTTP的知識。

          在之前的文章,小唐告訴了大家HTTP通信包括HTTP請求和HTTP響應,并且也告訴了大家兩臺主機在進行HTTP通信的時候,通信的內容可以通過HTTP請求報文和HTTP響應報文來分析。

          在接下來的一段時間,我們來聊聊HTTP請求。


          在HTTP請求中,包含了客戶端要對服務器所請求的內容和請求的信息,不管是內容還是信息,都是我們HTTP請求的基礎。嚴格意義上來講HTTP請求報文的每一個部分都有著其特定的含義。

          HTTP請求報文由請求頭、請求首部和請求實體三個主要部分組成,如下圖:

          HTTP請求報文組成

          什么是請求頭?

          請求頭是HTTP頭的一種,可以在HTTP請求中使用。用來對HTTP的請求做一個詳細的描述,并且要確保這樣的HTTP請求能夠讓服務端返回正確的響應。簡單的講,請求頭就像是某一篇議論文的第一段,起著概括性的描述的作用。

          什么是請求首部?

          請求首部是為了確保對HTTP請求有著更加詳細的描述。用于告訴服務器是誰或什么在發(fā)送請求、請求的來源在哪里等信息。因此服務器可以根據請求首部給出的客戶端信息來給客戶端提供更好的響應。我們可以這樣來理解,如果我們的HTTP請求頭作為一個大綱性的指導,那么,HTTP請求首部就是對這個大綱更進一步的描述。當規(guī)定了指導性的大綱后,也作出了具體的規(guī)劃。接下來我們就需要根據大綱和規(guī)范的指導,開始把請求數據正式的發(fā)送給服務器了,這就是請求實體的作用。

          什么是請求實體?

          簡而言之,請求實體就是我們要傳輸的數據了。因為,請求頭規(guī)定了大體的方向,請求首部告訴了我們客戶端要把請求發(fā)出去具體要怎么做,還少了一部分請求需要把什么內容發(fā)出去,而這一個缺少的部分就是通過請求實體來實現的。

          簡單的一句話理解就是請求頭規(guī)定了方向,請求首部落實了細節(jié),請求實體負責具體的實施。這三者之間的關系十分密切也是缺一不可的。


          隨著互聯網的發(fā)展,人們覺得對于HTTP報文的請求頭、請求首部和請求實體的定義太過于抽象。因此,又把HTTP請求報文的這三部分內容做了一個更加詳細的劃分,充分利用了分層的“分而治之”的思想。

          人們把HTTP報文的請求頭劃分為了請求方法、請求URI和協議版本三個部分;把請求首部又劃分出了許多有意義的字段,而請求實體本來就是一起的,把抽象的HTTP請求具體化了,因此我們可以畫出如下的更加具體的HTTP請求報文圖了:

          HTTP請求報文結構

          在接下來關于HTTP請求報文的學習,就會圍繞HTTP請求報文的結構來學習。

          請求方法

          一、什么是請求方法?

          對于請求方法的最簡單理解就是告知服務器的請求意圖以及用什么方式去請求。在HTTP/1.1中規(guī)定了八大請求方法。

          二、什么是請求URI?

          要想理解請求URI是什么,首先我們得理解什么是URI,為了方便大家的理解,小唐給大家舉一個簡單的例子,在你的面前,有著許多的盒子,每一個盒子都有一個唯一表示盒子所在位置的符號用來告訴你需要去哪里找這些盒子,大概意思就是盒子的位置是唯一的,我們可以通過定位的方式查找盒子所在的位置。那么,在廣闊的互聯網中,有著很多的互聯網資源,不同的資源在互聯中的位置都是唯一的。如果人們想要在互聯網中尋找某一個資源,那么,就一定會在互聯網中找到一個唯一用來定位互聯網資源的方法,這就是URI。URI在計算機領域叫做統(tǒng)一資源定位符,也就是小唐說的那一個唯一表示位置的的符號。

          如果人們想要訪問互聯網的資源,他一定不是隨便訪問的,因為人們知道所要尋找什么樣的互聯網資源,因此人們也知道這些資源在互聯網中的URI。所以如果想要訪問指定的互聯網資源,我們只需要找到這個資源的URI就行了,這樣的過程就叫做請求URI。

          那么,請求URI在什么位置可以找到呢,如果你是仔細的并且在訪問網站的時候你也留意過網站的域名變化,你一定遇到過這樣的格式:

          找一找請求URI

          如果你仔細的觀察就會發(fā)現這樣的地址由兩個部分組成,第一個部分是:http://www.xxx.com/ddd/search.php,第二個部分是?name=xiaotang&age=22。

          第一個部分表示的是一個查詢頁面,第二個部分表示的是通過什么條件去查詢,這兩個部分組合起來就是一個根據姓名和年齡查詢的功能頁面了。第二個部分又叫做查詢字符串。如果你還記得最開始學習的域名基礎的話,你也許還能把第一部分的內容進行更加詳細的劃分,比如:http://www.xxx.com是域名,那么/ddd/search.php是什么呢?這就是請求URI。在互聯網中,我們通常把域名和查詢字符串之間的那一個部分叫做請求URI。

          三、請求方法都有哪些?

          上文中,小唐提到了HTTP/1.1規(guī)定的用于表示請求的八大方法,接下來小唐會把這八大請求方法,做一個簡短的介紹,之后會拿出在生活和工作中經常用到的請求方法給大家一個詳細的講解。我們來看一看有哪些請求方法吧。

          1、八大請求方法概覽:

          • (1)GET方法:用來獲取服務器上的指定資源
          • (2)POST方法:可以把數據拋給服務器處理
          • (3)PUT方法:用來給服務器傳輸文件
          • (4)HEAD方法:用來獲取報文首部
          • (5)DELETE方法:用來刪除服務器上的文件
          • (6)OPTIONS方法:用來詢問服務器上的某一個URI資源支持那些請求方法
          • (7)TRACE方法:可以用來查看客戶端發(fā)送出去的請求是怎樣被加工修改/篡改的
          • (8)CONNECT方法:要求在于代理服務器通信的時候建立隧道,實現用隧道協議進行TCP通信。主要使用SSL和TLS協議把通信內容加密后經過網絡隧道進行傳輸。在對CONNECT方法的學習、SSL/TLS協議的學習,在之后的HTTPS講解,小唐會逐漸介紹給大家,不要著急奧。

          四、日常生活中常見的請求方法有哪些?

          在工作中或者生活中常用的方法主要有GET方法、POST方法、OPTIONS方法。

          1、GET方法

          GET方法是用來獲取服務器上已經被URI識別的Web資源的。表示請求訪問的指定資源經服務器解析后返回響應內容。簡單的講,如果客戶端請求訪問的資源是文本,服務器通過對請求的處理后,就會把這個資源保持原樣的返回給客戶端。如果客戶端請求訪問的是一個服務器的應用的計算功能的話,那么服務器就會把計算后的結果返回。

          舉個簡單的例子,我們有著這樣一個HTTP請求報文:

          HTTP請求報文1

          如上圖,客戶端對服務器發(fā)起了一個請求,其中請求的方法是GET,請求的URI是/index.html,用的是HTTP協議1.1版本的規(guī)范,并且通過首部指明了請求的服務器主機為www.example.com,此時,如果服務器收到了這樣的請求就會返回一個指定的資源。大白話理解就是,客戶端想訪問www.example.com的網站服務器的index.html資源,然后服務器把這個資源返回給客戶端。

          再舉一個例子,假設網站服務器上有一個查詢頁面的Web資源,我們把它叫做search.php頁面,這個頁面的主要功能是可以根據姓名和年齡來查詢信息,那么,客戶端想要想要請求服務器的查詢功能的時候就會產生這樣一個請求報文:

          HTTP請求報文2

          這個時候服務器收到這樣的請求就會把相應的結果返回給客戶端了。

          2、POST方法

          主要是用來傳輸請求主體的內容的,有著和GET方法同樣的作用,比如GET方法中的請求報文2這張圖,POST方法主要經常用于在網頁中有進行數據交互的表格。可以想象這樣一個頁面,在頁面中有著兩個輸入框,一個是用來輸入姓名的,一個是用來輸入年齡的,還有一個查詢按鈕,點擊查詢按鈕后,我們可以獲取查詢后的結果,如果客戶端要獲取這樣一個查詢頁面的查詢結果,就需要使用到POST方法了,因此POST方法就是一個把數據發(fā)送給服務器處理的過程。使用POST方法會產生類似于下面這樣一個HTTP請求報文:

          HTTP請求POST方法

          首先是字面意思的差別,GET方法表示的是獲取頁面,而POST方法表示的把數據交給服務器處理,當然在一定的時候POST方法要處理的數據也可以放在GET方法里面,但這不是安全的做法。

          其次,在使用GET方法的時候,請求報文里面的請求實體是空的,因為GET方法把請求實體里面的數據顯式的展示在了,URI里面,在瀏覽器的地址欄也能看見這些數據,因此類似于用戶名和密碼這些私密的內容就會暴露在大家面前;但POST方法不一樣,POST方法是把請求處理的數據放在請求實體里面的,而在真實的HTTP通信中請求報文是加密的,所以相比于GET方法,如果要處理隱私數據那么POST方法是最佳的選擇。

          3、OPTIONS方法

          OPTIONS方法可是大有作用,它主要用來查詢針對某一個請求URI指定的資源支持那些HTTP請求方法的,相當于一個查詢操作,查詢的是Web資源支持使用哪些請求方法,服務器在收到HTTP請求的OPTIONS方法的時候,會返回這一個Web資源支持那些HTTP請求方法。

          五、什么是協議版本?

          協議版本相比于請求方法來說就更容易理解了,它其實就是指的HTTP協議的版本號,到目前為止HTTP協議一共有三個版本,分別是HTTP 0.9,HTTP/1.0和HTTP/1.1的版本,而現在我們常用的是HTTP/1.1版本。


          接下來我們再來說一說請求首部字段的那些事。

          請求首部字段

          請求首部字段簡單的講就是從客戶端向服務器端發(fā)送請求報文時使用的首部。補充了請求的附加內容、客戶端信息、響應內容相關優(yōu)先級等信息。通常情況下,我們能在請求報文中經常看見的請求首部字段有這些,小唐簡單在這里給大家簡單的描述下:

          • Accept:用戶代理可處理的媒體類型
          • Accept-Charset:優(yōu)先的字符集
          • Accept-Encoding:優(yōu)先的內容編碼
          • Accept-Language:優(yōu)先的語言(自然語言)
          • Host:請求資源所在的服務器
          • Referer:對請求中URI的原始獲取方
          • User-Agent:HTTP客戶端程序的信息

          接下來,我們依次的看一下這些請求首部字段都是做什么用的,可以告訴服務器的那些附加請求信息。

          1、Accept:用戶代理可處理的媒體類型

          Accept首部字段可通知服務器,用戶代理能夠處理的媒體類型以及媒體類型的優(yōu)先級,可以使用type/subtype這種形式來表示。這里有幾種常見的媒體類型表現形式可以參考一下:

          (1)文本文件

          text/html,text/json,application/xml等

          (2)圖片文件:

          image/jpeg,image/png等

          (3)視頻文件:

          video/mpeg等

          (4)應用程序的二進制文件:

          application/octest-stream等。

          如果想要給顯示的媒體類型增加優(yōu)先級,則使用q=來額外表示權重值,用分號進行分隔。權重值q的范圍是0-1,q為1的時候表示最大,不指定權重值q的時候默認q=1.0,當服務器提供多種內容的時候,將會首先返回權重值最高的媒體類型。

          2、Accept-Charset:優(yōu)先的字符集

          Accept-Charset首部字段可以用來通知服務器用戶代理支持的字符集及字符集相對優(yōu)先順序。另外,可一次性指定多種字符集。與首部字段Accept相同的是可以使用權重q來表示相對優(yōu)先級。

          3、Accept-Encoding:優(yōu)先的內容編碼

          Accept-Encoding首部字段用來告知服務器用戶代理支持的內容編碼及內容編碼的優(yōu)先級順序。可一次性指定多種內容編碼。下面是常見的幾種內容編碼類型:gzip、deflate等,采用權重q值來表示相對優(yōu)先級,也可以使用*號作為通配符,指定任意的編碼格式。

          4、Accept-Language:優(yōu)先的語言(自然語言)

          首部字段Accept-Language用來告知服務器用戶代理能夠處理的自然語言集(指中文或英文等),以及自然語言集的相對優(yōu)先級。可一次指定多種自然語言集,同樣的可以使用q來表示優(yōu)先級。

          5、Host:請求資源所在的服務器

          首部字段Host會告知服務器,請求的資源所處互聯網的主機名和端口號。Host首部字段是HTTP/1.1規(guī)范內是唯一一個必須被包含在請求內的首部字段。

          6、Referer:對請求中URI的原始獲取方

          首部字段Referer會告知服務器請求的原始資源的URI,這個時候,服務器看見這個字段就會知道請求是從哪一個頁面發(fā)起的。

          7、User-Agent:HTTP客戶端程序的信息

          首部字段User-Agent會將創(chuàng)建請求的瀏覽器和用戶代理名稱等信息傳達給服務器。

          通過本篇文章,你將會學習到請求報文中常用的請求方法、常用的請求首部字段的意義,在接下來的文章中,小唐將會帶你進入響應報文的學習,我們不見不散。

          歡迎關注【小唐IT實用技術講解】頭條號,一起加速成長,成為一名優(yōu)秀的互聯網技術精英~如果你喜歡小唐的文章,不妨點贊、轉發(fā)、收藏一下哦。

          TTP有兩種報文格式:

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

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

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

          請求報文:

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


          一.請求行:

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

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

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

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

          1. GET:想特定的資源發(fā)出請求。
          2. POST:向指定的資源提交相應的數據金星煥處理請求,比如說提交表單、上傳文件。數據被包含在請求實體中。
          3. PUT:從客戶端向服務器傳送的數據取代指定的文檔的內容。
          4. DELETE:請求服務器刪除指定的頁面
          5. OPTIONS:允許客戶端查看服務器的性能。
          6. HEAD:類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭
          7. TRANS:回顯服務器收到的請求,主要用于測試或診斷。
          8. 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實體和傳遞參數,而參數之間用“&”進行分割。其中,如果傳輸的數據是英文字母或者數據,則原樣發(fā)送;如果時空格,轉換成“+”;如果是中文或者其他的字符,則直接把傳輸的數用BASE64加密,轉換成十六進制輸出,比如后面的%E4%BD%A0%E5%A5%BD就是16進制的輸出。

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

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

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

          一般來說,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請求發(fā)送時,會把保存在該請求域名下的所有cookie值一起發(fā)送給web服務器。 示例:Cookie: $Version=1; Skin=new;

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

          三.請求實體:

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

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

          上圖中的“Pn=2&kw=nba”就是具體的請求報文。


          響應報文:

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

          一.狀態(tài)行

          在響應中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請求信息。狀態(tài)行(status line)通過提供一個狀態(tài)碼來說明所請求的資源情況。

          狀態(tài)行格式如下:

          HTTP-Version Status-Code Reason-Phrase CRLF

          其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發(fā)回的響應狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。狀態(tài)代碼由三位數字組成,第一個數字定義了響應的類別,且有五種可能取值。

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

          對于,我們開發(fā)人員來說,狀態(tài)行中可能最重要的就是狀態(tài)碼,不同狀態(tài)碼能表示出此次請求的狀態(tài)。

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

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

          二.響應頭部:

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

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

          三.響應正文:

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


          主站蜘蛛池模板: 内射白浆一区二区在线观看| 久久国产免费一区二区三区| 国产高清在线精品一区二区 | 无码中文人妻在线一区| 少妇特黄A一区二区三区| 精品福利一区二区三区免费视频| eeuss鲁片一区二区三区| 内射少妇一区27P| 果冻传媒董小宛一区二区| 亚洲午夜精品一区二区公牛电影院 | 无码人妻精品一区二区三区99性 | 亚洲一区中文字幕久久| 性色AV一区二区三区天美传媒| 国产伦理一区二区三区| 色狠狠一区二区三区香蕉蜜桃| 精品三级AV无码一区| 精品中文字幕一区二区三区四区| 日韩人妻无码一区二区三区| 在线观看国产一区二三区| 日本一区视频在线播放| 国产丝袜美女一区二区三区| 国产一区二区三区韩国女主播| 日本中文一区二区三区亚洲| 亚洲无删减国产精品一区| 日本v片免费一区二区三区| 亚洲AV无码一区二区二三区入口| 成人精品一区二区激情| 中文字幕在线播放一区| 亚洲一区无码中文字幕乱码| 国产观看精品一区二区三区| 国产一区二区三区韩国女主播| 精品人妻少妇一区二区| 99精品国产一区二区三区2021| 亚洲AV无码一区二区三区国产 | 日韩人妻一区二区三区蜜桃视频 | 美女视频一区二区三区| 精品人无码一区二区三区 | 日韩福利视频一区| 日韩内射美女人妻一区二区三区| 美女福利视频一区二区| 亚洲欧美国产国产综合一区|