不管是別人提起還是自己提起對Http的了解碾牌,雖然會用但是卻不知從何說起,我把這點總結(jié)為基礎(chǔ)不是很扎實儡循,借此作如下歸納舶吗,以加強對HTTP的了解
HTTP請求格式:
HTTP協(xié)議采用 “消息頭/消息體”的分割方式,消息頭告訴對方這個消息是干什么的择膝,消息體告訴對方怎么干誓琼。每一個HTTP包都分為HTTP頭和HTTP體兩部分,消息體是可選的,而消息頭是必須的
http請求方法:最常用的是GET腹侣、POST
GET作用: 請求獲取由 Request-URI 所標識的資源
GET說明: GET是默認的HTTP請求方法叔收,例如當我們通過在瀏覽器的地址欄中直接輸入網(wǎng)址的方式去訪問網(wǎng)頁的時候,瀏覽器采用的就是 GET 方法向服務(wù)器獲取資源傲隶。用GET方法提交的表單數(shù)據(jù)只經(jīng)過了簡單的編碼饺律,同時它將作為URL的一部分向服務(wù)器發(fā)送。也就是說get方法的請求參數(shù)是攜帶在請求頭中的伦籍,因為請求頭是有長度限制的蓝晒,所以請求參數(shù)也會有長度限制腮出。
例如:
<Http://localhost/login.php?username=aa&password=1234>
POST作用 : 請求服務(wù)器接收在請求中封裝的實體帖鸦,并將其作為由 Request-Line 中的 Request-URI 所標識的資源的一部分
POST說明: POST的請求參數(shù)是請求體中,因此沒有長度限制
GET和POST的區(qū)別:
1胚嘲、 在客戶端作儿,Get方式在通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到馋劈;POST方式攻锰,數(shù)據(jù)放在HTTP包的body中。
2妓雾、 GET方式提交的數(shù)據(jù)大小有限制(因為瀏覽器對URL的長度有限制)娶吞,而POST則沒有此限制。
3械姻、安全性問題妒蛇。正如在(1)中提到,使用 Get 的時候楷拳,參數(shù)會顯示在地址欄上绣夺,而 Post 不會。所以欢揖,如果這些數(shù)據(jù)是中文數(shù)據(jù)而且是非敏感數(shù)據(jù)陶耍,那么使用 get;如果用戶輸入的數(shù)據(jù)不是中文字符而且包含敏感數(shù)據(jù)她混,那么還是使用 post為好烈钞。
4.、服務(wù)器取值方式不一樣坤按。GET方式取值毯欣,如php可以使用$_GET來取得變量的值,而POST方式通過$_POST來獲取變量的值晋涣。
http請求數(shù)據(jù)示例:
POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
username=aa&password=1234
http的請求由請求行仪媒、請求頭、請求正文組成
請求行:請求方法 URI 協(xié)議/版本
請求頭(Request Header)
請求正文
請求頭:
表示持久連接
connection:Kepp-Alive
例如: Connection: keep-alive 當一個網(wǎng)頁打開完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉算吩,如果客戶端再次訪問這個服務(wù)器上的 網(wǎng)頁留凭,會繼續(xù)使用這一條已經(jīng)建立的連接
例如: Connection: close 代表一個Request完成后,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會關(guān)閉偎巢, 當客戶端再次發(fā)送Request蔼夜,需要重新建立TCP連接
Accept:
作用:瀏覽器可以接受的媒體類型(MIME類型),
例如: Accept: text/html 代表瀏覽器可以接受服務(wù)器回發(fā)的類型為 text/html 也就是我們常說的html文檔, 如果服務(wù)器無法返回text/html類型的數(shù)據(jù),服務(wù)器應(yīng)該返回一個406錯誤(non acceptable)压昼。
通配符 * 代表任意類型求冷。例如 Accept: / 代表瀏覽器可以處理所有類型,(一般瀏覽器發(fā)給服務(wù)器都是發(fā)這個)
Accept-Encoding:
作用: 瀏覽器申明自己接收的編碼方法窍霞,通常指定壓縮方法匠题,是否支持壓縮,支持什么壓縮方法(gzip但金,deflate)韭山,(注意:這不是只字符編碼);
例如: Accept-Encoding: gzip, deflate。Server能夠向支持gzip/deflate的瀏覽器返回經(jīng)gzip或者deflate編碼的HTML頁面冷溃。 許多情形下這可以減少5到10倍的下載時間钱磅,也節(jié)省帶寬。
Accept-Language:
作用: 瀏覽器申明自己接收的語言似枕。
語言跟字符集的區(qū)別:中文是語言盖淡,中文有多種字符集,比如big5凿歼,gb2312褪迟,gbk等等;
例如: Accept-Language:zh-cn 毅往。如果請求消息中沒有設(shè)置這個報頭域牵咙,服務(wù)器假定客戶端對各種語言都可以接受。
User-Agent:
作用:告訴HTTP服務(wù)器攀唯, 客戶端使用的操作系統(tǒng)和瀏覽器的名稱和版本.
我們上網(wǎng)登陸論壇的時候洁桌,往往會看到一些歡迎信息,其中列出了你的操作系統(tǒng)的名稱和版本侯嘀,你所使用的瀏覽器的名稱和版本另凌,這往往讓很多人感到很神奇,實際上戒幔, 服務(wù)器應(yīng)用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域允許客戶端將它的操作系統(tǒng)吠谢、瀏覽器和其它屬性告訴服務(wù)器。
例如: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Cookie:
作用: 最重要的header, 將cookie的值發(fā)送給HTTP 服務(wù)器
Content-Length
作用:發(fā)送給HTTP服務(wù)器數(shù)據(jù)的長度诗茎。即請求消息正文的長度工坊;
例如: Content-Length: 38
Content-Type:
作用:Content-Type用于指定內(nèi)容類型,一般是指網(wǎng)頁中存在的Content-Type,Content-Type屬性指定請求和響應(yīng)的HTTP內(nèi)容類型王污。如果未指定 ContentType罢吃,默認為text/htm
例如:Content-Type: application/x-www-form-urlencoded
Content-Type:
1.text/html
2.text/plain
3.text/css
4.text/javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
1. application/x-www-form-urlencoded是常用的表單發(fā)包方式,普通的表單提交昭齐,或者js發(fā)包尿招,默認都是通過這種方式
2. multipart/form-data用在上傳文件的POST包。
3. boundary用于數(shù)據(jù)分割阱驾, 當上傳文件太長就谜,HTTP無法在一個包之內(nèi)發(fā)送完畢,就需要分割數(shù)據(jù)里覆,分割成一個一個chunk發(fā)送給服務(wù)端
4. .application/json 通過json形式將數(shù)據(jù)發(fā)送給服務(wù)器丧荐,HTTP通信中并不存在所謂的json,而是將string轉(zhuǎn)成json罷了租谈,也就是篮奄,application/json可以將它理解為text/plain捆愁,普通字符串
http響應(yīng)數(shù)據(jù)示例
HTTP/1.1 200 OK
Date: Sun, 17 Mar 2013 08:12:54 GMT
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
<html>
<head>
<title>HTTP響應(yīng)示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
在接受和解釋請求消息后割去,服務(wù)器會返回一個http響應(yīng)消息,http響應(yīng)消息也是由三個部分組成分別是狀態(tài)行昼丑、響應(yīng)頭呻逆、響應(yīng)正文
狀態(tài)行
狀態(tài)行由協(xié)議版本、響應(yīng)狀態(tài)碼組成(200 ok)
狀態(tài)碼說明:
1xx:指示信息——表示請求已經(jīng)接受菩帝,繼續(xù)處理
2xx:成功——表示請求已經(jīng)被成功接收咖城、理解、接受呼奢。
3xx:重定向——要完成請求必須進行更進一步的操作
4xx:客戶端錯誤——請求有語法錯誤或請求無法實現(xiàn)
5xx:服務(wù)器端錯誤——服務(wù)器未能實現(xiàn)合法的請求宜雀。
常見狀態(tài)代碼、狀態(tài)描述握础、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤辐董,不能被服務(wù)器所理解
401 Unauthorized //請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務(wù)器收到請求禀综,但是拒絕提供服務(wù)
404 Not Found //請求資源不存在简烘,eg:輸入了錯誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯誤
503 Server Unavailable //服務(wù)器當前不能處理客戶端的請求,一段時間后可能恢復(fù)正常
總結(jié)如下:
1XX 響應(yīng)中
2XX 成功
3XX 重定向
4XXX 客戶端錯誤
5XXX 服務(wù)器錯誤
Date:
作用:生成消息的具體時間和日期定枷,即當前的GMT時間孤澎。
例如: Date: Sun, 17 Mar 2013 08:12:54 GMT
Set-Cookie
作用: 非常重要的header, 用于把cookie 發(fā)送到客戶端瀏覽器, 每一個寫入cookie都會生成一個Set-Cookie.
例如: Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Content-Type:
作用:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對象的類型和字符集,
Content-Length:
指明實體正文的長度欠窒,以字節(jié)方式存儲的十進制數(shù)字來表示覆旭。在數(shù)據(jù)下行的過程中,Content-Length的方式要預(yù)先在服務(wù)器中緩存所有數(shù)據(jù),然后所有數(shù)據(jù)再一股腦兒地發(fā)給客戶端型将。
例如: Content-Length: 19847
Content-Encoding:
作用:文檔的編碼(Encode)方法絮供。一般是壓縮方式。
WEB服務(wù)器表明自己使用了什么壓縮方法(gzip茶敏,deflate)壓縮響應(yīng)中的對象壤靶。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時間。
例如:Content-Encoding:gzip
Location:
作用: 用于重定向一個新的位置惊搏, 包含新的URL地址
實例請看304狀態(tài)實例
注意
HTTP協(xié)議是無狀態(tài)的和Connection: keep-alive的區(qū)別
無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力贮乳,服務(wù)器不知道客戶端是什么狀態(tài)。從另一方面講恬惯,打開一個服務(wù)器上的網(wǎng)頁和你之前打開這個服務(wù)器上的網(wǎng)頁之間沒有任何聯(lián)系向拆。
HTTP是一個無狀態(tài)的面向連接的協(xié)議,無狀態(tài)不代表HTTP不能保持TCP連接酪耳,更不能代表HTTP使用的是UDP協(xié)議(無連接)浓恳。
從HTTP/1.1起,默認都開啟了Keep-Alive碗暗,保持連接特性颈将,簡單地說,當一個網(wǎng)頁打開完成后言疗,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會關(guān)閉晴圾,如果客戶端再次訪問這個服務(wù)器上的網(wǎng)頁,會繼續(xù)使用這一條已經(jīng)建立的連接噪奄。
Keep-Alive不會永久保持連接死姚,它有一個保持時間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個時間