一、什么是HTTP協議:
1、概念:
客戶端連上web服務器后,若想獲得web服務器中的某個web資源,需遵守一定的通訊格式,HTTP協議用於定義客戶端與web服務器通迅的格式(規定客戶端和服務器如何進行交互)。
HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是基於TCP/IP協議的一個應用層協議,用於定義WEB瀏覽器與WEB服務器之間交換數據的過程。
注:HTTP協議是學習JavaWeb開發的基石,不深入了解HTTP協議,就不能說掌握了WEB開發,更無法管理和維護一些復雜的WEB站點。
OSI網絡七層協議:
應用層(HTTP、FTP、SMTP、POP3、TELNET)-》表示層-》會話層-》傳輸層(TCP、UDP)-》網絡層(IP)-》數據鏈路層-》物理層
注:傳輸層和網絡層的協議統稱為TCP/IP協議。
2、HTTP請求:
HTTP使用請求-響應的方式進行傳輸,一個請求對應一個響應,並且請求只能由客戶端發出,服務器只能被動的等待請求做出響應。
3、Win7自帶的Telnet工具:
利用Telnet可以簡單地演示請求與響應的過程。Win7默認沒有打開telnet功能,要在控制面板中開啟:
操作如下:
我們先在D:\apache-tomcat-8.0.14\webapps\MyTest目錄下建一個test.html頁面,效果如下:(Tomcat端口已改為80)
然后在cmd中輸入如下命令:
telnet localhost 80
然后馬上按住快捷鍵ctrl+],回車。緊接着輸入如下命令:
GET /MyTest/test.html HTTP/1.1 Host:localhost
兩次回車后,就可以看到網頁上的內容了:
這種方式太麻煩了,建議用下面介紹的httpwatch
4、httpwatch工具:
httpwatch是專門為IE瀏覽器和火狐瀏覽器提供的,用來查看HTTP請求和相應的工具,對於我們開發者很有幫助,可以使我們更好的學習HTTP協議。
安裝完成后,就可以在IE瀏覽器中看到這個插件了:
清空瀏覽器緩存,重新輸入網址,效果如下:
上圖中,左邊是瀏覽器發出的響應,右邊是服務器返回的請求。
同樣,在chrome瀏覽器中看到的效果是這樣的:
5、HTTP1.0和HTTP1.1的區別:
- 在HTTP1.0協議中,客戶端與web服務器建立連接后,只能獲得一個web資源。
- HTTP1.1協議,允許客戶端與web服務器建立連接后,在一個連接上獲取多個web資源。
注:通俗來講,區別只有一個:當客戶端與web服務器建立連接后(底層是流的操作),如果采用HTTP1.0協議,流會立即斷開;HTTP1.1協議,流會保存一段時間,下次重新連接時,還繼續使用這個流。
問題:一個web頁面中,使用img標簽引用了三幅圖片,當客戶端訪問服務器中的這個web頁面時,客戶端總共會訪問幾次服務器,即向服務器發送了幾次HTTP請求。
答案:3次。
二、get/post請求的區別:
注:GET請求方式和POST請求區別在於請求參數在傳遞的過程中方式不同
- get請求方式:顯式請求方式,請求參數會在URL上顯示,相對快,安全性較低,請求數據的大小一般不超過1kb。
- post請求方式:隱式請求方式,請求參數將會在http請求的實體內容中進行傳輸,相對慢,安全性較高 ,請求數據的大小沒有限制
三、常見請求頭與相應頭:
還是來看上面這個網頁:
第一行為請求行,剩下的內容為請求頭、實體內容。
請求行:GET /MyTest/test.html HTTP/1.1 請求方式、請求的資源部分的名稱、所遵循的協議版本
1、常見請求頭:
- Host:www.baidu.com 本次請求訪問的主機地址(虛擬主機名稱)
- Cache-control:no-cache 設置網頁緩存的使用方法
- Pragma:no-cache
- Accept:text/html,xxxxxx…..客戶端可以接收的數據類型(如果內容是:*/*,表示接收所有類型)
- User-Agent:Mozilla/5.0xxxxx 主要表示客戶端類型
- Accept-Encoding:gzip,deflate,sdch 瀏覽器能夠接收的數據壓縮編碼方式(表示瀏覽器能夠接收什么格式的壓縮的數據)
- Accept-Language:zh-CN,zh;q=0.8 瀏覽器期望的接受的語言種類
- Accept-Charset: ISO-8859-1 客戶端所接收的字符集編碼
- If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT 和緩存機制相關的頭
- Referer: http://www.smyh.me/index.jsp 當前頁面來自哪個頁面(可能是由之前的頁面通過超鏈接點進到這個頁面來)
- Cookie
- Connection: close/Keep-Alive 請求完之后,是關閉此連接,還是繼續保持連接
- Date: Tue, 11 Jul 2013 18:23:51 GMT 當前請求的時間
注:上面的這些指的是get請求的請求頭。
接着來看第一段網頁中右邊的內容:
第一行為狀態行,后面的內容為響應頭、實體內容。
狀態行:HTTP/1.1 200 OK 協議版本、狀態碼、原因敘述<CRLF>
【狀態碼】
狀態碼:用於表示服務器對本次請求的處理結果,它是一個三位的十進制數。響應狀態碼分為5類,如下所示:
常見狀態碼如下:
- 200 成功接收請求
- 302 實現重定向的功能
- 304/307 使用瀏覽器中內置的緩存資源
- 404 客戶端請求錯誤
- 500 服務器段出現錯誤
2、常見響應頭:
常見的響應頭鍵值對的含義:
- Location: http://www.smyh.me/index.jsp 重定向(302+Location實現重定向)
- Server 服務器類型
- Content-Encoding 服務器當前返回給客戶端的數據壓縮格式
- Content-Length 返回給客戶端的數據量的大小
- Content-Language: zh-cn 語言種類
- Content-Type: text/html; charset=GB2312 返回的數據的類型、返回的字符集編碼方式(通過設置charset,讓瀏覽器用指定的方式進行解碼)
- Last-Modified 資源最后一次修改的時間(配合請求頭中的If-Modified-Since+304/307實現緩存機制)
- Refresh: 1;url=http://www.it315.org 隔多少秒以后,讓當前頁面去訪問哪個地址(例如網頁登陸成功,3秒后跳回原來的界面,就是用的這個頭)
- Content-Disposition: attachment;filename=aaa.zip 和下載相關,通知瀏覽器以附件的形式下載服務器發送過去的數據
- Transfer-Encoding: chunked 數據傳輸模式
- Set-Cookie:SS=Q0=5Lb_nQ; path=/search 和cookie相關的頭
- ETag: W/"83794-1208174400000" 和cookie相關的頭
- Expires: -1 通知瀏覽器是否緩存當前資源:如果這個頭的值是一個以毫秒為單位值,則通知瀏覽器緩存資源到指定的時間點;如果值是0或-1,則通知瀏覽器禁止緩存
- Cache-Control: no-cache 通知瀏覽器是否緩存資源
- Pragma: no-cache -- 通知瀏覽器是否緩存資源
注: 之所以上面的三個頭是一個功能,是因為歷史原因。不同的瀏覽器對這三個頭支持的不同,一般來說這三個頭要同時使用,以確保不同的瀏覽器都能實現控制緩存的功能
- Connection: close/Keep-Alive 是否繼續保持連接
- Date: Tue, 11 Jul 2000 18:23:51 GMT 當前響應的時間