http請求報文包含三個部分(請求行 + 請求頭 + 請求體)
一、請求行
請求行包含三個內容: method + request-URI + http-version
請求行例如:GET /icwork/? Search = product HTTP/1.1
1.1 請求方法
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,用於檢查對象是否存在用於得到元數據 |
1.2 get方法和post方法
get方法:
是在url中說明情請求的資源,比如https://www.baidu.com/con?from=self?_t=1466609839126 其中?后的數據就是請求的數據,並且連接用&,get方法也可以提交表單數據,但是提交的數據在url中,其他人可以通過查看歷史記錄中的url來獲取你提交的數據,這樣很不安全
post方法
傳輸數據不在url中,而在數據段中出現,並且請求頭多了Content-Type 和 Content-Length,post提交表單數據的時候比get方法更安全
1.3 post方法提交表單和get方法提交表單相比較
- get明文傳輸,信息附加在url上面,get明文傳輸,post更加安全
- get傳輸有大小限制,應該是3k,post需要制定傳輸類型
- get多用於獲取數據,根據get變量的不同調用不同的數據,post多用於提交數據,提交用戶輸入的數據
1.4 get方法和post方法的區別:
- Get是向服務器發索取數據的一種請求,而Post是向服務器提交數據的一種請求
- Get是獲取信息,而不是修改信息,類似數據庫查詢功能一樣,數據不會被修改
- Get請求的參數會跟在url后進行傳遞,請求的數據會附在URL之后,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX為該符號以16進制表示的ASCII,如果數據是英文字母/數字,原樣發送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密。
- Get傳輸的數據有大小限制,因為GET是通過URL提交數據,那么GET可提交的數據量就跟URL的長度有直接關系了,不同的瀏覽器對URL的長度的限制是不同的。
- GET請求的數據會被瀏覽器緩存起來,用戶名和密碼將明文出現在URL上,其他人可以查到歷史瀏覽記錄,數據不太安全。在服務器端,用Request.QueryString來獲取Get方式提交來的數據
- Post請求則作為http消息的實際內容發送給web服務器,數據放置在請求體中,Post沒有限制提交的數據。Post比Get安全,當數據是中文或者不敏感的數據,則用get,因為使用get,參數會顯示在地址,對於敏感數據和不是中文字符的數據,則用post
- POST表示可能修改變服務器上的資源的請求,在服務器端,用Post方式提交的數據只能用Request.Form來獲取
二、請求頭
2.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響應之后先解碼,然后再檢查文件格式。
2.2 get方法請求頭例如:
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
2.3 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的數據的長度
2.4 舉例說明
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響應由三個部分組成分別是狀態行,響應頭,響應正文
3.1 狀態行
狀態行是由:HTTP-Version + Status-Code + Reason-Phrase
比如:HTTP/1.1 200 ok
分別表示:http版本 + 狀態碼 + 狀態代碼的文本描述
響應狀態碼
| 狀態碼類型 | 表達意義 |
|---|---|
| 1xx | 指示信息–表示請求已接收,繼續處理 |
| 2xx | 成功–表示請求已被成功接收、理解、接受 |
| 3xx | 重定向–要完成請求必須進行更進一步的操作。 |
| 4xx | 客戶端錯誤–請求有語法錯誤或請求無法實現。 |
| 5xx | 服務器端錯誤–服務器未能實現合法的請求。 |
3.2 響應頭
響應頭:包含服務器類型,日期,長度,內容類型等
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
3.3 響應正文
響應正文響應正文就是服務器返回的HTML頁面,HTTP響應頭與響應正文之間也必須以空行分隔
正文部分的MIME類型:HTTP請求及響應的正文部分可以是任意格式的數據,如何保證接收方能看得懂發送方發送的正文數據呢?HTTP協議采用MIME協議來規范正文的數據格式。
| 文件擴展名 | MIME類型 |
|---|---|
| .bin .exe .o .a .z | application/octet-stream |
| application/pdf | |
| .zip | application/zip |
| .tar | application/x-tar |
| .gif | image/gif |
| .jpg .jpeg | image/jpeg |
| .htm .html | text/html |
| .text .c .h .txt .java | text/plain |
| .mpg .mpeg | video/mpeg |
| .xml | application/xml |
| 表單上傳文件 | multipart/form-data |
<form>標簽的enctype屬性:用於指定表單數據的MIME類型,取值為multipart/form-data,表示表單數據為復合類型的數據,包含多個子部分。
