HTTP協定(現在都用https協定更安全)
- HTTP協定簡介
- HTTP 超文本傳輸協定 (HTTP-Hypertext transfer protocol),是一個屬于應用層的面向對象的協定,由于其簡捷、快速的方式,适用于分布式超媒體資訊系統。它于1990年提出,經過幾年的使用與發展,得到不斷地完善和擴充。它是一種詳細規定了浏覽器和網際網路伺服器之間互相通信的規則,通過網際網路傳送網際網路文檔的資料傳送協定。
- 用戶端與服務端通信時傳輸的内容我們稱之為封包。
- HTTP就是一個通信規則,這個規則規定了用戶端發送給伺服器的封包格式,也規定了伺服器發送給用戶端的封包格式。實際我們要學習的就是這兩種封包。用戶端發送給伺服器的稱為”請求封包request“,伺服器發送給用戶端的稱為”響應封包response“。
- HTTP協定的發展曆程
- 超文本傳輸協定的前身是世外桃源(Xanadu)項目,超文本的概念是泰德˙納爾森(Ted Nelson)在1960年代提出的。進入哈佛大學後,納爾森一直緻力于超文本協定和該項目的研究,但他從未公開發表過資料。1989年,蒂姆˙伯納斯˙李(Tim Berners Lee)在CERN(歐洲原子核研究委員會 = European Organization for Nuclear Research)擔任軟體咨詢師的時候,開發了一套程式,奠定了網際網路(WWW = World Wide Web)的基礎。1990年12月,超文本在CERN首次上線。1991年夏天,繼Telnet等協定之後,超文本轉移協定成為網際網路諸多協定的一分子。
- 當時,Telnet協定解決了一台計算機和另外一台計算機之間一對一的控制型通信的要求。郵件協定解決了一個發件人向少量人員發送資訊的通信要求。檔案傳輸協定解決一台計算機從另外一台計算機批量擷取檔案的通信要求,但是它不具備一邊擷取檔案一邊顯示檔案或對檔案進行某種處理的功能。新聞傳輸協定解決了一對多新聞廣播的通信要求。而超文本要解決的通信要求是:在一台計算機上擷取并顯示存放在多台計算機裡的文本、資料、圖檔和其他類型的檔案;它包含兩大部分:超文本轉移協定和超文本标記語言(HTML)。HTTP、HTML以及浏覽器的誕生給網際網路的普及帶來了飛躍。
- HTTP協定的會話方式
- 浏覽器與伺服器之間的通信過程要經曆四個步驟
- 浏覽器與WEB伺服器的連接配接過程是短暫的,每次連接配接隻處理一個請求+響應。對每一個頁面的通路,浏覽器與WEB伺服器都要建立一次單獨的連接配接。
- 浏覽器到WEB伺服器之間的所有通訊都是完全獨立分開的請求和響應對。
- HTTP1.0和HTTP1.1的差別
- 在HTTP1.0版本中,浏覽器請求一個帶有圖檔的網頁,會由于下載下傳圖檔而與伺服器之間開啟一個新的連接配接;但在HTTP1.1版本中,允許浏覽器在拿到目前請求對應的全部資源後再斷開連接配接,提高了效率。
- HttpWatch
2.1 安裝
- 由于IE8以下的IE浏覽器沒有提供監聽HTTP的功能,是以如果要使用IE8以下的浏覽器檢視HTTP請求的内容需要安裝一個工具HttpWatch。
- Firefox和chrome都有内置的開發者工具,可以直接檢視Http請求。
- HttpWatch的使用非常簡單,直接安裝,然後一直下一步,直到安裝完成。
2.2 使用
- 安裝完成後,打開IE浏覽器,工具下拉清單可以看到HttpWatch Professional選項
浏覽器現在的開發者工具就可以實作
- 打開後點選Record按鈕開始監聽Http請求。
- 封包
封包頭 |
6.1 封包格式
封包體 |
6.2 請求封包
6.2.1 封包格式
請求首行(請求行); 請求頭資訊(請求頭); 空行; 請求體; |
6.2.2 GET請求
GET /Hello/index.jsp HTTP/1.1請求首行(請求行) Accept: **:告訴伺服器,目前用戶端可以接收的文檔類型, ** 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://ocalhost: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是表單字段的名字。
6.3 響應封包
6.3.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/htm;charset=UTF-8:響應體使用的編碼為UTF-8;
- Content-Length: 274:響應體為274位元組;
- Date: Tue, 07 Apr 2015 10:08:26 GMT:響應的時間,這可能會有8小時的時區差;
6.3.2 響應碼
響應碼對浏覽器來說很重要,它告訴浏覽器響應的結果;
- 200:請求成功,浏覽器會把響應體内容(通常是html)顯示在浏覽器中;
- 404:請求的資源沒有找到,說明用戶端錯誤的請求了不存在的資源;(4開頭的問題都出在浏覽器端)
- 500:請求資源找到了,但伺服器内部出現了錯誤;
- 302:重定向,當響應碼為302時,表示伺服器要求浏覽器重新再發一個請求,伺服器會發送一個響應頭Location,它指定了新請求的URL位址;
- 就以下面這個URL為例,介紹下普通URL的各部分組成
-
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
從上面的URL可以看出,一個完整的URL包括以下幾部分:
1、協定部分:該URL的協定部分為“http:”,這代表網頁使用的是HTTP協定。在Internet中可以使用多種協定,如HTTP,FTP等等本例中使用的是HTTP協定。在"HTTP"後面的“//”為分隔符
- 2、域名部分:該URL的域名部分為“www.aspxfans.com”。一個URL中,也可以使用IP位址作為域名使用(電腦的IP位址)
- 3、端口部分:跟在域名後面的是端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,将采用預設端口80
- 4、虛拟目錄部分:從域名後的第一個“/”開始到最後一個“/”為止,是虛拟目錄部分。虛拟目錄也不是一個URL必須的部分。本例中的虛拟目錄是“/news/”
- 5、檔案名部分:從域名後的最後一個“/”開始到“?”為止,是檔案名部分,如果沒有“?”,則是從域名後的最後一個“/”開始到“#”為止,是檔案部分,如果沒有“?”和“#”,那麼從域名後的最後一個“/”開始到結束,都是檔案名部分。本例中的檔案名是“index.asp”。檔案名部分也不是一個URL必須的部分,如果省略該部分,則使用預設的檔案名
- 6、錨部分:從“#”開始到最後,都是錨部分。本例中的錨部分是“name”。錨部分也不是一個URL必須的部分
- 7、參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜尋部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。