最近看了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,參數會顯示在地址,對於敏感數據和不是中文字符的數據,則用post
7>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響應由三個部分組成分別是狀態行,響應頭,響應正文。
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頁面