http請求/響應包格式
一、什麽是http協議?
轉載:http://blog.csdn.net/daijin888888/article/details/51025634
由w3c制訂的一種網絡應用層協議,定義了瀏覽器與web服務器之間通信的過程以及通信時所使用的數據格式。
1)通信的過程
step1,瀏覽器建立與web服務器之間的連接
step2,瀏覽器將請求數據打包(生成請求數據包)並發送給web服務器。
step3,web服務器將處理結果打包(生成響應數據包)並發送給瀏覽器。
step4,web服務器關閉連接。
如果瀏覽器要再發請求,需要重新建立新的連接。
特點: 一次請求,一次連接
優點: web服務器可以利用有限的連接為盡可能多的客戶端(瀏覽器)服務。
2)數據格式
a,請求數據包
如:
[plain] view plain copy- POST /web02/hello HTTP/1.1
- Host: localhost:8080
- User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Connection: keep-alive
- Referer: http://localhost:8888/web02/hello_form.html
- Content-Type: application/x-www-form-urlencoded
- Content-Length: 16
請求行: 請求方式 請求資源路徑 協議類型和版本
消息頭:
消息頭是一些鍵值對,一般由w3c定義,瀏覽器與web服務器之間都可以發送,表示特定的某種含義,比如,瀏覽器可以發送"user-agent"消息頭,告訴web服務器瀏覽器的類型和版本。
實體內容:
只有當請求方式為post時才有值(請求參數),如果請求方式為get,請求參數會添加到請求資源路徑的後面。
b,響應數據包
如:
[plain] view plain copy
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Content-Type: text/html;charset=utf-8
- Content-Length: 30
- Date: Thu, 05 Dec 2013 07:16:28 GMT
狀態行: 協議類型和版本 狀態碼 狀態描述
b1,什麽是狀態碼
是一個三位數字,由w3c定義,表示服務器處理請求的狀態。
b2,常見的狀態碼
200: 服務器處理請求正常。
404: 服務器依據請求路徑找不到對應的資源。
500: 系統錯誤,服務器端的程序在運行過程當中出錯了。
405: 服務器找不到可執行的方法來處理請求。
消息頭:
服務器也可以發送一些消息頭給瀏覽器,比如"content-type",告訴瀏覽器,服務器返回的數據類型和編碼格式(字符集)。
實體內容:
程序處理的結果,瀏覽器會將實體內容中的數據取出來,生成相應的頁面。
二、請求方式
1)哪一些情況下,瀏覽器會發送get請求
a,直接在瀏覽器地址欄輸入某個地址
b,點擊鏈接
c,表單使用默認的提交方式
2)get請求的特點
a,會將請求參數放到請求資源路徑的後面,只能提交少量的數據(因為請求行最多只能存放2k左右的數據)。
b,會將請求參數顯示在瀏覽器地址欄,不安全(路由器會記錄請求地址)。
3)哪一些情況下,瀏覽器會發送post請求
設置了表單的method屬性值為post
4)post請求的特點
a,會將請求參數放到實體內容裏面,能提交大量的數據。
b,不會將請求參數顯示在瀏覽器地址欄,相對安全(瀏覽器沒有加密)。
不管是get還是post,都不會對請求參數加密,所以如果是敏感數據,一般都需要加密處理(https)。
Http協議支持六種請求方法,即:
0,GET
1,HEAD
2,PUT
3,DELETE
4,POST
5,OPTIONS
6.trace
但其實我們大部分情況下只用到了GET和POST。如果想設計一個符合RESTful規範的web應用程序,則這六種方法都會用到。不過即使暫時不想涉及REST,了解這六種方法的本質仍然是很有作用的。大家將會發現,原來web也是很簡潔明了的。下面依次說明這六種方法。
0,GET:GET可以說是最常見的了,它本質就是發送一個請求來取得服務器上的某一資源。資源通過一組HTTP頭和呈現數據(如HTML文本,或者圖片或者視頻等)返回給客戶端。GET請求中,永遠不會包含呈現數據。
1,HEAD:HEAD和GET本質是一樣的,區別在於HEAD不含有呈現數據,而僅僅是HTTP頭信息。有的人可能覺得這個方法沒什麽用,其實不是這樣的。想象一個業務情景:欲判斷某個資源是否存在,我們通常使用GET,但這裏用HEAD則意義更加明確。
2,PUT:這個方法比較少見。HTML表單也不支持這個。本質上來講, PUT和POST極為相似,都是向服務器發送數據,但它們之間有一個重要區別,PUT通常指定了資源的存放位置,而POST則沒有,POST的數據存放位置由服務器自己決定。舉個例子:如一個用於提交博文的URL,/addBlog。如果用PUT,則提交的URL會是像這樣的”/addBlog/abc123”,其中abc123就是這個博文的地址。而如果用POST,則這個地址會在提交後由服務器告知客戶端。目前大部分博客都是這樣的。顯然,PUT和POST用途是不一樣的。具體用哪個還取決於當前的業務場景。
3,DELETE:刪除某一個資源。基本上這個也很少見,不過還是有一些地方比如amazon的S3雲服務裏面就用的這個方法來刪除資源。
4,POST:向服務器提交數據。這個方法用途廣泛,幾乎目前所有的提交操作都是靠這個完成。
5,OPTIONS:這個方法很有趣,但極少使用。它用於獲取當前URL所支持的方法。若請求成功,則它會在HTTP頭中包含一個名為“Allow”的頭,值是所支持的方法,如“GET, POST”。
其實還有一個TRACE方法,不過這個基本上不會用到,這裏就不介紹了。
http請求/響應包格式