1. 程式人生 > >http請求資料的格式

http請求資料的格式

最近看了tinyhttpd的伺服器代理,看了看http請求資料包的格式和內容

http請求報包含三個部分:

請求行 + 請求頭 + 資料體

請求行包含三個內容 method + request-URI + http-version

method 包含有 post , get, head,delete, put, connect, options, patch, propfind, propatch, mkcol, copy, move, lock, unlock, trace, head

方法:

get 

通過請求URI獲得資源

post 

用於新增新的資源,用於表單提交

put 

用於修改某個內容

delete 

刪除某個內容

connect 

用於代理進行傳輸例如SSL

options 

詢問可以執行那些方法

patch 

部分文件更該

propfind 

檢視屬性

proppatch 

設定屬性

mkcol 

建立集合

copy 

拷貝

move 

移動

lock 

加鎖

unlock 

解鎖

trace 

用於遠端診斷伺服器

head 

類似於get,用於檢查物件是否存在用於得到元資料

主要介紹get方法和post方法

get方法:

  是在url中說明情請求的資源,比如https://www.baidu.com/con?from=self?_t=1466609839126 其中?後的資料就是請求的資料,並且連線用&,get方法也可以提交表單資料,但是提交的資料在url中,其他人可以通過檢視歷史記錄中的url來獲取你提交的資料,這樣很不安全

post方法:

  傳輸資料不在url中,而在資料段中出現,並且請求頭多了Content-Type 和 Content-Length,post提交表單資料的時候比get方法更安全

post方法提交表單和get方法提交表單相比較:

1>get明文傳輸,資訊附加在url上面,get明文傳輸,post更加安全2> get傳輸有大小限制,應該是3k,post需要制定傳輸型別3 >get多用於獲取資料,根據get變數的不同調用不同的資料,post多用於提交資料,提交使用者輸入的資料

get方法和post方法的區別:

1>Get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種請求2>Get是獲取資訊,而不是修改資訊,類似資料庫查詢功能一樣,資料不會被修改3>Get請求的引數會跟在url後進行傳遞,請求的資料會附在URL之後,以?分割URL和傳輸資料,引數之間以&相連,%XX中的XX為該符號以16進製表示的ASCII,如果資料是英文字母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密。4>Get傳輸的資料有大小限制,因為GET是通過URL提交資料,那麼GET可提交的資料量就跟URL的長度有直接關係了,不同的瀏覽器對URL的長度的限制是不同的。5>GET請求的資料會被瀏覽器快取起來,使用者名稱和密碼將明文出現在URL上,其他人可以查到歷史瀏覽記錄,資料不太安全。在伺服器端,用Request.QueryString來獲取Get方式提交來的資料6>Post請求則作為http訊息的實際內容傳送給web伺服器,資料放置在請求體中,Post沒有限制提交的資料。Post比Get安全,當資料是中文或者不敏感的資料,則用get,因為使用get,引數會顯示在地址,對於敏感資料和不是中文字元的資料,則用post7>POST表示可能修改變伺服器上的資源的請求,在伺服器端,用Post方式提交的資料只能用Request.Form來獲取

請求行例如 : GET /icwork/? Search = product HTTP/1.1

請求頭

請求頭包含:

Accept:指瀏覽器或其他客戶可以接愛的MIME檔案格式。Servlet可以根據它判斷並返回適當的檔案格式。

User-Agent:是客戶瀏覽器名稱

Host:對應網址URL中的Web名稱和埠號。

Accept-Langeuage:指出瀏覽器可以接受的語言種類,如en或en-us,指英語。

connection:用來告訴伺服器是否可以維持固定的HTTP連線。http是無連線的,HTTP/1.1使用Keep-Alive為預設值,這樣,當瀏覽器需要多個檔案時(比如一個HTML檔案和相關的圖形檔案),不需要每次都建立連線

Cookie:瀏覽器用這個屬性向伺服器傳送Cookie。Cookie是在瀏覽器中寄存的小型資料體,它可以記載和伺服器相關的使用者資訊,也可以用來實現會話功能。

Referer:表明產生請求的網頁URL。如比從網頁/icconcept/index.jsp中點選一個連結到網頁/icwork/search,在向伺服器傳送的GET/icwork/search中的請求中,Referer是http://hostname:8080/icconcept/index.jsp。這個屬性可以用來跟蹤Web請求是從什麼網站來的。

User-Agent:是客戶瀏覽器名稱。

Content-Type:用來表名request的內容型別。可以用HttpServletRequest的getContentType()方法取得。

Accept-Charset:指出瀏覽器可以接受的字元編碼。英文瀏覽器的預設值是ISO-8859-1.

Accept-Encoding:指出瀏覽器可以接受的編碼方式。編碼方式不同於檔案格式,它是為了壓縮檔案並加速檔案傳遞速度。瀏覽器在接收到Web響應之後先解碼,然後再檢查檔案格式。

getf方法請求頭例如:

Accept:image/webp,image/*,*/*;q=0.8

Accept-Encoding:gzip, deflate, sdch, br

Accept-Language:en-US,en;q=0.8

Connection:keep-alive

Cookie:PSTM=1466499789; BAIDUID=D3A617EE01FFA9DB9B7E3E5F0D3A01EE:FG=1; BIDUPSID=4AA34EC11075CB66B8BC9792DD422B6F; BDUSS=VCc1M0cVQtYnFGfmxTUW5kVTUydnBZUmhiWFRXbnRlMnpIdWV2ODVxNHZ1WkZYQVFBQUFBJCQAAAAAAAAAAAEAAADkEA1ZtPO3rMfRt6zH0cfRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8salcvLGpXdz; BD_HOME=1; BD_UPN=123353; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; BD_CK_SAM=1; H_PS_PSSID=19292_18286_1458_20318_18241_20369_17942_20388_19690_20417_18560_17001_15560_12277_20253; BDSVRTM=0

Host:www.baidu.com

Referer:https://www.baidu.com/s?wd=http%20%E8%AF%B7%E6%B1%82%E6%95%B0%E6%8D%AE%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E6%A0%BC%E5%BC%8F&rsv_spt=1&rsv_iqid=0x9b746a8000022af9&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&oq=http%20%E8%AF%B7%E6%B1%82%E6%96%B9%E5%BC%8Fpost%20url%E6%A0%BC%E5%BC%8F&rsv_t=59fb7cEn5xgK8JFpqQ7F7coy6k6dn5sGpEMj1cDM4oMoy0TGArJ2l3fxOqy6F9lXoqoi&inputT=7936&rsv_pq=ca5859d100027005&rsv_sug3=73&rsv_sug1=12&rsv_sug7=100&rsv_sug2=0&rsv_sug4=32020

User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36

post方法的請求頭

Accept:*/*

Accept-Encoding:gzip, deflate, br

Accept-Language:en-US,en;q=0.8

Authorization:Basic WkEtMTE0MjcyNjAyMDY=

Connection:keep-alive

Content-Length:666

Content-Type:application/json

Host:zhihu-web-analytics.zhihu.com

Origin:http://www.zhihu.com

Referer:http://www.zhihu.com/question/41690822

User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36

Request Payload

view source

相比之下多了content-Type 和 Content-Length

Content-Type:表示的是請求報文體的 MIME 型別  ,注:GET的請求訊息體是空的 所以不需要指定訊息體的MIME型別

Content-Length:表示的是 post的資料的長度 

例如請求資料:

1 GET/sample.jspHTTP/1.1

2 Accept:image/gif.image/jpeg,*/*

3 Accept-Language:zh-cn

4 Connection:Keep-Alive

5 Host:localhost

6 User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

7 Accept-Encoding:gzip,deflate

8  

9 username=jinqiao&password=1234

第一行為http請求行,包含方法,URI 和http版本

1-7為請求頭,包含瀏覽器,主機,接受的編碼方式和壓縮方式

第8行表示一個空行 表示請求頭結束 這個空行是必須的

第9行是資料體,比如是需要查詢的資訊。

http響應體由三部分組成:

http響應由三個部分組成分別是狀態行,響應頭,響應正文。

狀態行是由:HTTP-Version+Status-Code+Reason-Phrase

比如:HTTP/1.1 200 ok

分別表示http版本 + 狀態碼 + 狀態程式碼的文字描述

狀態碼:

1xx

指示資訊–表示請求已接收,繼續處理

2xx

成功–表示請求已被成功接收、理解、接受

3xx

重定向–要完成請求必須進行更進一步的操作。

4xx

客戶端錯誤–請求有語法錯誤或請求無法實現。

5xx

伺服器端錯誤–伺服器未能實現合法的請求。

響應頭:包含伺服器型別,日期,長度,內容型別等

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:13:33 GMT

Content-Type:text/html

Last-Moified:Mon,6 Oct 2003 13:23:42 GMT

Content-Length:112

 響應正文響應正文就是伺服器返回的HTML頁面