1.HTTP協議簡介
- HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通信的規則。
- 客戶端與服務端通信時傳輸的內容我們稱之為報文。
- HTTP就是一個通信規則,這個規則規定了客戶端發送給服務器的報文格式,也規定了服務器發送給客戶端的報文格式。實際我們要學習的就是這兩種報文。客戶端發送給服務器的稱為”請求報文“,服務器發送給客戶端的稱為”響應報文“。
2. HttpWatch
2.1 安裝
- 由於IE8以下的IE瀏覽器沒有提供監聽HTTP的功能,所以如果要使用IE8以下的瀏覽器查看HTTP請求的內容需要安裝一個工具HttpWatch。
- Firefox和chrome都有內置的開發者工具,可以直接查看Http請求。
- HttpWatch的使用非常簡單,直接安裝,然后一直下一步,直到安裝完成。
2.2 使用
- 安裝完成后,打開IE瀏覽器,工具下拉列表可以看到HttpWatch Professional選項
- 打開后點擊Record按鈕開始監聽Http請求。
3. 報文
3.1 報文格式
3.2 請求報文
3.1.1 報文格式
請求首行; 請求頭信息; 空行; 請求體; |
3.1.2 GET請求
GET /Hello/index.jsp HTTP/1.1 Accept: */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Accept-Encoding: gzip, deflate Host: localhost:8080 Connection: Keep-Alive Cookie: JSESSIONID=C55836CDA892D9124C03CF8FE8311B15
|
Get請求沒有請求體,所以也沒有空行!
- GET /Hello/index.jsp HTTP/1.1:GET請求,請求服務器路徑為Hello/index.jsp,協議為1.1;
- Host:localhost:請求的主機名為localhost;
- User-Agent: Mozilla/4.0 (compatible; MSIE 8.0…:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
- Accept: */*:告訴服務器,當前客戶端可以接收的文檔類型, */*,就表示什么都可以接收;
- Accept-Language: zh-CN:當前客戶端支持的語言,可以在瀏覽器的工具à選項中找到語言相關信息;
- Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮后再發送;
- Connection: keep-alive:客戶端支持的鏈接方式,保持一段時間鏈接,默認為3000ms;
- Cookie: JSESSIONID=369766FDF6220F7803433C0B2DE36D98:因為不是第一次訪問這個地址,所以會在請求中把上一次服務器響應中發送過來的Cookie在請求中一並發送去過。
3.1.3 POST請求
- POST請求要求將form標簽的method的屬性設置為post
POST /Hello/target.html HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* Referer: http://localhost:8080/Hello/ Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 14 Connection: Keep-Alive Cache-Control: no-cache Cookie: JSESSIONID=774DA38C1B78AE288610D77621590345
username=admin |
- POST請求是可以有體的,而GET請求不能有請求體。
- Referer: http://localhost:8080/hello/index.jsp:請求來自哪個頁面,例如你在百度上點擊鏈接到了這里,那么Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄中直接輸入的地址,那么就沒有Referer這個請求頭了;
- Content-Type: application/x-www-form-urlencoded:表單的數據類型,說明會使用url格式編碼數據;url編碼的數據都是以“%”為前綴,后面跟隨兩位的16進制,例如“東軟”這兩個字使用UTF-8的url編碼用為“%E4%BC%A0%E6%99%BA”;
- Content-Length:13:請求體的長度,這里表示13個字節。
- keyword=hello:請求體內容!hello是在表單中輸入的數據,keyword是表單字段的名字。
3.3 響應報文
3.2.1 報文格式
響應首行; 響應頭信息; 空行; 響應體; |
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Content-Length: 274 Date: Tue, 07 Apr 2015 10:08:26 GMT
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" > <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Hello</h1> </body> </html> |
- HTTP/1.1 200 OK:響應協議為HTTP1.1,狀態碼為200,表示請求成功;
- Server: Apache-Coyote/1.1:服務器的版本信息;
- Content-Type: text/html;charset=UTF-8:響應體使用的編碼為UTF-8;
- Content-Length: 274:響應體為274字節;
- Date: Tue, 07 Apr 2015 10:08:26 GMT:響應的時間,這可能會有8小時的時區差;
-
get請求與post請求的區別:
1、除了表單method屬性設置為post外,表單默認為get請求
2、get請求通過url地址傳送參數,post請求通過請求體傳送參數
3、get請求沒有請求體,post請求有請求體
4、get請求發送的參數可以通過地址欄看到,而post請求發送的參數不能看到,所以post請求相較安全一些
5、url地址的字符限制為255個字符,所以get請求不能發送大量信息
6、請求體的大小沒有限制,所以我們可以通過post請求發送任何信息
7、一般情況下提交表單透視post請求
3.2.2 響應碼
響應碼對瀏覽器來說很重要,它告訴瀏覽器響應的結果;
- 200:請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中;
- 404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源;
- 500:請求資源找到了,但服務器內部出現了錯誤;
- 302:重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location,它指定了新請求的URL地址;