主要記錄一下http協(xié)議的一些簡單的知識秽之,主要包括請求消息成肘,響應(yīng)消息的組成亿遂,以及get和post的‘對比’浓若,對于更詳細(xì)的信息可以看下http RFC盒使。https也沒有做說明。
http基于請求響應(yīng)模式七嫌,無狀態(tài)少办,應(yīng)用層的協(xié)議,特點如下:
- 支持C/S模式诵原。
- 無連接英妓,每次連接只處理一個請求,服務(wù)器處理完請求绍赛,并返回給客戶端之后蔓纠,就會斷開連接。
- 無狀態(tài)吗蚌,指的是協(xié)議對于事務(wù)處理沒有記憶能力腿倚,如果需要前面的信息,需要重傳蚯妇。
http請求消息(Request)
http請求由三部分組成:請求行敷燎,請求頭,請求體箩言。比如下面的例子:
GET / HTTP/1.1
Host: cxis.me
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2,nb;q=0.2,da;q=0.2
GET / HTTP/1.1
是請求行硬贯,GET是請求方法,/
是請求資源在服務(wù)器上的路徑陨收,HTTP/1.1
是http協(xié)議版本號饭豹。
剩下的是請求頭,格式為xxxx: value
务漩。
這里是get方法拄衰,所有沒有請求體,請求體是向服務(wù)器提交的數(shù)據(jù)饵骨,在請求頭和請求體中間會有一行空行翘悉。
http響應(yīng)消息(Response)
響應(yīng)消息包括:響應(yīng)行,響應(yīng)頭宏悦,響應(yīng)體镐确。一個響應(yīng)消息如下:
HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: text/html; charset=utf-8
Last-Modified: Wed, 03 May 2017 08:32:57 GMT
Access-Control-Allow-Origin: *
Expires: Wed, 03 May 2017 13:51:42 GMT
Cache-Control: max-age=600
Content-Encoding: gzip
X-GitHub-Request-Id: AACA:40A3:65A338:8EB391:5909DE15
Content-Length: 9905
Accept-Ranges: bytes
Date: Wed, 03 May 2017 14:41:45 GMT
Via: 1.1 varnish
Age: 0
Connection: keep-alive
X-Served-By: cache-nrt6130-NRT
X-Cache: HIT
X-Cache-Hits: 1
X-Timer: S1493822505.031176,VS0,VE181
Vary: Accept-Encoding
X-Fastly-Request-ID: bc385cef3dbff07f200175fa461c920cb6ca4b3f
HTTP/1.1 200 OK
是響應(yīng)行,HTTP/1.1
是http協(xié)議版本號饼煞,200是狀態(tài)碼,OK是狀態(tài)消息诗越,和響應(yīng)碼對應(yīng)砖瞧。
剩下的是響應(yīng)頭,這里沒有響應(yīng)體嚷狞。GET方法的響應(yīng)體為空块促。
請求方法
- GET荣堰,獲取被Request-URI指定的信息。
- POST竭翠,向服務(wù)器提交數(shù)據(jù)振坚。
- HEAD,獲取響應(yīng)消息報頭斋扰。
- PUT渡八,請求服務(wù)器保存一個資源。
- DELETE传货,請求服務(wù)器刪除資源屎鳍。
- TRACE,請求服務(wù)器回應(yīng)收到的請求消息问裕。
- OPTIONS逮壁,查詢相關(guān)的資源和選項。
- CONNECT粮宛,預(yù)留關(guān)鍵字窥淆,現(xiàn)在沒有用。
GET和POST對比
GET和POST我覺得不應(yīng)該硬拿來對比巍杈,他們是http規(guī)范定義的兩種不同的方法祖乳,各有各的用處,為什么要對比呢秉氧?
關(guān)于定義
GET是獲取資源眷昆,是冪等的;POST是提交資源汁咏,是非冪等的亚斋。它們是http協(xié)議里面定義的兩個不同的方法。
關(guān)于緩存
GET請求的響應(yīng)是可緩存的攘滩,但是需要響應(yīng)滿足HTTP緩存的要求帅刊。POST響應(yīng)是不可緩存的,除非響應(yīng)里面有Cache-Control或者Expires屬性漂问。
關(guān)于請求數(shù)據(jù)
GET方法會把請求的數(shù)據(jù)附加到URL之后赖瞒,也就是放到請求行中;POST則是把提交的數(shù)據(jù)放到請求體中蚤假。因此在地址欄可以直接看到GET請求提交的參數(shù)栏饮,而看不到POST請求的參數(shù)。
關(guān)于安全
通常我們說的有關(guān)安全磷仰,只是相對的安全袍嬉,比如說GET方法能直接在地址欄看到參數(shù),而POST不能。這通常讓人認(rèn)為是安全和不安全的區(qū)別伺通,其實如果抓包或者其他手段一樣可以看到GET和POST提交的數(shù)據(jù)箍土,兩者并沒有什么安全可言。
關(guān)于數(shù)據(jù)長度
http協(xié)議并沒有對傳輸?shù)臄?shù)據(jù)大小做限制罐监,也沒有對URL長度做限制吴藻,所以從http協(xié)議本身來說并沒有長度的限制。而我們通常說的URL或者數(shù)據(jù)的長度限制其實是瀏覽器或者服務(wù)器的限制弓柱。
對于GET請求來說沟堡,提交的數(shù)據(jù)都會在URL中,各瀏覽器對URL的限制不太一樣吆你,所以沒有什么標(biāo)準(zhǔn)可言弦叶;對于POST請求來說,數(shù)據(jù)存放在請求體中妇多,并沒有長度限制伤哺,但是服務(wù)器通常會有對POST提交數(shù)據(jù)的大小限制,因此也沒有標(biāo)準(zhǔn)可言者祖。
關(guān)于POST兩次請求
對于GET請求立莉,瀏覽器會把請求頭和請求體一起發(fā)送;而對于POST請求七问,瀏覽器會先發(fā)送請求頭蜓耻,服務(wù)器響應(yīng)100 continue
之后,瀏覽器再發(fā)送請求體械巡。
狀態(tài)碼
在響應(yīng)消息的狀態(tài)行中有一個狀態(tài)碼和狀態(tài)消息刹淌,兩者是對應(yīng)的,狀態(tài)碼總共有五大類:
- 1xx讥耗,做指示信息有勾,表示請求被接收到,繼續(xù)處理古程。
- 2xx蔼卡,成功,表示被成功接收挣磨,理解雇逞,接受。
- 3xx茁裙,重定向塘砸,為了完成請求必須采取進一步的動作。
- 4xx呜达,客戶端錯誤谣蠢,請求有語法錯誤或者請求無法實現(xiàn)。
- 5xx查近,服務(wù)端錯誤眉踱,服務(wù)器未能實現(xiàn)請求。
而具體的狀態(tài)碼有很多霜威,不在這里一一列舉谈喳,下面是一些常用到的:
- 200 OK,表示請求成功
- 400 Bad Request 客戶端錯誤戈泼,有語法錯誤
- 401 Unauthorized婿禽,請求未授權(quán)
- 403 Forbidden,服務(wù)器拒絕服務(wù)
- 404 Not Found大猛,資源不存在
- 405 Method Not Allowed扭倾,方法不被允許
- 500 Internal Server Error,服務(wù)器內(nèi)部錯誤
- 502 Bad Gateway挽绩,網(wǎng)關(guān)錯誤
- 503 Service Unavailable膛壹,服務(wù)不可用
消息報頭
在請求消息的第二部分是請求頭,在響應(yīng)消息的第二部分是響應(yīng)頭唉堪,請求頭和響應(yīng)頭又叫做消息報頭模聋,這是可選的。其實消息報頭不只是包括請求頭和響應(yīng)頭唠亚,一個消息報頭包括:普通報頭链方、請求報頭、響應(yīng)報頭灶搜、實體報頭祟蚀。
下面列出了各種報頭,含義沒有一一列出割卖,如有需要可以查看http RFC
普通報頭
普通報頭既適用于請求消息也適用于響應(yīng)消息前酿,這些頭域不適用于實體傳輸,只適用于傳輸消息究珊。
- Cache-Control 控制緩存指令薪者,緩存指令是單向,獨立的剿涮。
- Connection 允許發(fā)送指定連接的選項
- Date 消息產(chǎn)生的日期和時間
- Pragma
- Trailer
- Transfer-Encoding
- Upgrade
- Via
- Waring
請求報頭
- Accept 指定客戶端接受哪些類型的信息
- Accept-Charset 指定客戶端接受的字符集
- Accept-Encoding 指定客戶端可接受的內(nèi)容編碼
- Accept-Language 指定客戶端可接受的語言
- Authorization 客戶端有權(quán)限查看某個資源
- Expect
- From
- Host 指定被請求資源的主機和端口號
- If-Match
- If-Modified-Since
- If-None-Match
- If-Range
- If-Unmodified-Since
- Max-Forwards
- Proxy-Authorization
- Range
- Referer
- TE
- User-Agent
響應(yīng)報頭
- Accept-Ranges
- Age
- ETag
- Location
- Proxy-Authenticate
- Retry-After
- Server
- Vary
- WWW-Authenticate
實體報頭
- Allow
- Content-Encoding
- Content-Language
- Content-Length 指明實體正文的長度言津,以字節(jié)方式存儲的十進制數(shù)字來表示
- Content-Location
- Content-MD5
- Content-Range
- Content-Type 指明發(fā)送給接收者的實體正文的媒體類型
- Expires 響應(yīng)過期的日期和時間
- Last-Modified 用于指示資源的最后修改日期和時間
- extension-header