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頁面