HTTP協(xié)議詳解

HTTP協(xié)議詳解

INDEX 原文地址

  • 什么是HTTP協(xié)議
  • URL
  • HTTP消息結(jié)構(gòu)
  • HTTP方法
  • 狀態(tài)碼
  • Header Field
  • 請求體格式
  • 理解HTTP通訊方式

什么是HTTP協(xié)議

  • 協(xié)議是指計算機通信網(wǎng)絡(luò)中兩臺計算機之間進行通信所必須共同遵守的規(guī)則。
  • 超文本傳輸協(xié)議(HTTP)作為其中一種,它允許將超文本標(biāo)記語言文檔從web服務(wù)器傳送給客戶端。(由于使用MIME機制/多用途因特網(wǎng)郵件擴展,可以傳輸多種類型的文件)

URL

  • URL(Uniform Resource Locator / 統(tǒng)一資源定位符)用于標(biāo)記一個網(wǎng)絡(luò)上的資源?;靖袷饺缦拢?/li>
schema://login@host[:port#]/path/..../[?query-string][#anchor]

    /*
     scheme: 協(xié)議名(如http,https,ftp)
     login: 登陸信息
     host: 服務(wù)器IP/域名
     port#:HTTP服務(wù)的默認(rèn)端口是80,這種情況下端口號可以省略。如果使用了別的端口,必須指明,例如http://www.cnblogs.com:8080
     path: 資源路徑
     query-string: 發(fā)送給web服務(wù)器的數(shù)據(jù)
     anchor: 片段標(biāo)識符
     */
  • 一個例子:
http://www.mywebsite.com/sj/test/test.aspx?name=sivergn&x=true#stuff

    /*
     schema: http
     host: www.mywebsite.com
     path: /sj/test/test.aspx
     Query String: name=sviergn&x=true
     Anchor: stuff
     */

HTTP消息結(jié)構(gòu)

請求消息/Request
GET http://www.cnblogs.com/  HTTP/1.1
Host:www.cnblogs.com
Request Line METHOD/path-to-resource HTTP/version-number
Request Header Field1 : Value
Request Header Field2 : Value
空行 空行
Request Body data(optional)
  • Request Line/請求行
  • Method:請求方法,如GET/POST。
  • path-to-resource:所請求的資源在web服務(wù)器上的路徑。
  • HTTP/version-number:HTTP協(xié)議版本號。
  • Request Header / 請求頭,記錄請求行以外的重要信息。
  • Request Body / 請求體,攜帶提交給web服務(wù)器的數(shù)據(jù)。使用GET方法時,為空。
  • 注意,Body和Header之間空一行。
響應(yīng)消息/Response
Response Line HTTP/version-number status-code message
Response Header Field1 : Value
Response Header Field2 : Value
空行 空行
Response Body data(optional)
  • Response Line/響應(yīng)行
  • HTTP/version-number:HTTP協(xié)議版本號。
  • status-code:狀態(tài)碼,反應(yīng)服務(wù)器處理是否正常,告知出現(xiàn)的錯誤。
  • message:狀態(tài)消息,同狀態(tài)碼對應(yīng)。
  • Response Header / 響應(yīng)頭,記錄響應(yīng)體數(shù)據(jù)的相關(guān)信息。
  • Response Body / 響應(yīng)體,攜帶需要向web服務(wù)器發(fā)送的數(shù)據(jù)。使用GET方法時,為空。
  • 注意,Body和Header之間空一行。

HTTP方法

  • 用于告知服務(wù)器我的意圖

  • GET,從服務(wù)器上獲取特定資源

  • POST,上傳請求體。

  • HEAD,獲取關(guān)于特定資源的響應(yīng)頭

  • GET和POST方法的區(qū)別

  1. 數(shù)據(jù)存放位置
  • GET:將數(shù)據(jù)放在URL之后,以?連接;參數(shù)之間以&進行拼接,例如:EditPosts.aspx?name=test1&id=12345
  • POST:數(shù)據(jù)放在Request Body中。
  1. 數(shù)據(jù)大小限制
  • GET:所提交數(shù)據(jù)的大小有限制(因為瀏覽器對URL的長度有限制)。
  • POST:沒有限制。
  1. 安全性
  • GET:所提交的數(shù)據(jù)以明文的形式顯示在URL上。
  • POST:由于保存在Request Body中,增加了安全系數(shù)。
  1. 緩存
  • GET:緩存服務(wù)器返回的響應(yīng)。
  • POST:不緩存。

狀態(tài)碼

  • 由三位數(shù)字和狀態(tài)消息組成:

  • 1XX(信息描述):接受的請求正在處理。

  • 2XX(成功狀態(tài)):請求正常處理完畢。其中206表示請求部分內(nèi)容成功/Range。

  • 3XX(重定向狀態(tài)):需要進行附加操作以完成請求。

  • 4XX(客戶端錯誤):服務(wù)器無法處理請求。

  • 5XX(服務(wù)器錯誤):服務(wù)器處理請求出錯。


Header Field

Request Header Field / 請求頭域
  • User-Agent:客戶端程序信息。
  • Range:獲取資源的范圍(從0開始,末尾位置為文件長度 - 1),單位字節(jié):
  • bytes=500-1000,從500開始,下載到1000。
  • bytes=500-,從500開始下載,直至數(shù)據(jù)末尾。
  • bytes=-500,從0開始下載到500。
Response Header Field / 響應(yīng)頭域
  • Content-Length:Response Body數(shù)據(jù)的大?。ㄗ止?jié))。
  • Keep-Alive:服務(wù)器端的超時限制/timeout,最大同時連接數(shù)/max。
  • Content-Type:Response Body數(shù)據(jù)的的媒體類型(MIME)。注意,如果利用POST請求向服務(wù)器上傳文件,則需遵從以下格式:
/*
1. form-data;和boundary=之間有一個空格。
2. boundary=之后的內(nèi)容可以是任意字符串。
*/
multipart/form-data;(空格)boundary=---------------------------195362999817818974031690194806

請求體格式

  • 單個文件上傳

/*
原始boundary以及頭尾部boundary的不同之處:
  ---------------------------195362999817818974031690194806 // oriBoundary,設(shè)置在Content-Type中
-----------------------------195362999817818974031690194806 // 頭部boundary,--oriBoundary(前面2個-)
-----------------------------195362999817818974031690194806-- // 尾部boundary,--oriBoundary--(前后都有2個--)
*/

-----------------------------195362999817818974031690194806 // 頭部boundary
Content-Disposition: form-data; name="userfile"; filename="vcpg" // 內(nèi)容屬性,form-data; name="服務(wù)器用于接收文件的參數(shù)名": filename="文件被發(fā)送給服務(wù)器時所使用的名稱"
Content-Type: application/octet-stream // 萬能文件類型
// 空行
// 文件內(nèi)容開始
//...
// 文件內(nèi)容結(jié)束
-----------------------------195362999817818974031690194806-- // 尾部boundary,其緊貼文件內(nèi)容的結(jié)尾
  • 上傳多個文件 + 多個參數(shù)
-----------------------------418888951815204591197893077 // 文件1的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件1.md"
Content-Type: text/markdown
// 空行
// 文件1內(nèi)容開始
// ...
// 文件1內(nèi)容結(jié)束
-----------------------------418888951815204591197893077 // 文件2的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件2"
Content-Type: application/octet-stream
// 空行
// 文件2內(nèi)容開始
// ...
// 文件2內(nèi)容結(jié)束
-----------------------------418888951815204591197893077 // 文件3的頭部boundary
Content-Disposition: form-data; name="userfile[]"; filename="文件3"
Content-Type: application/octet-stream
// 空行
// 文件3內(nèi)容開始
// ...
// 文件3內(nèi)容結(jié)束
-----------------------------418888951815204591197893077 // 參數(shù)username的頭部boundary
Content-Disposition: form-data; name="username"

zhangsan
-----------------------------418888951815204591197893077 // 參數(shù)password的頭部boundary
Content-Disposition: form-data; name="password"

zhangxx
-----------------------------418888951815204591197893077-- // 尾部boundary,表示結(jié)束


理解HTTP通訊方式

  • 客戶端和服務(wù)器的通訊是有來有回的,而且總是以客戶端首先發(fā)起請求,服務(wù)器進行響應(yīng)的形式發(fā)生。
  • 所謂通訊就是傳輸數(shù)據(jù),根據(jù)數(shù)據(jù)的大小,可以將其分為三種類型:(c表示客戶端;s表示服務(wù)器)
  • c小:s小,適用方法GET / POST。
  • c?。簊大,適用方法GET / POST。
  • c大:s小,適用方法POST。
  • 注意,對于客戶端來說,不管是上傳還是下載大數(shù)據(jù),都需要解決內(nèi)存管理問題。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容