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ū)別
數(shù)據(jù)存放位置
- GET:將數(shù)據(jù)放在URL之后,以?連接;參數(shù)之間以&進行拼接,例如:
EditPosts.aspx?name=test1&id=12345
- POST:數(shù)據(jù)放在Request Body中。
數(shù)據(jù)大小限制
- GET:所提交數(shù)據(jù)的大小有限制(因為瀏覽器對URL的長度有限制)。
- POST:沒有限制。
安全性
- GET:所提交的數(shù)據(jù)以明文的形式顯示在URL上。
- POST:由于保存在Request Body中,增加了安全系數(shù)。
緩存
- 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)存管理問題
。