Http協議入門
從一個簡單的例子入手
(1)啓動tomcat服務器;
(2)在瀏覽器(這裏用的Chrome)輸入URL:
http://localhost:8080/myweb/index.jsp(網頁事先已經建好);
(3)右鍵審查元素(如果是火狐,需要使用firebug插件:右鍵->firebug->網絡);
(4)點擊Network -> Headers -> view source
這時,就可以看到瀏覽器的請求和服務器的響應詳情。
http請求
- 一個完整的HTTP請求包括:一個請求行、若干請求頭、以及實體內容
GET /myweb/index.jsp HTTP/1.1 //請求行
/*
*多個請求頭(多個key-value對象)
*/
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8
Cookie: JSESSIONID=27E506D9063D7F10CB3C4E1FE554E1EF
//一個空行
/*
*(可選)實體內容
*/
請求行
http協議版本:
- http1.0:當前瀏覽器客戶端與服務器端建立連接之後,只能發送一次請求,一次請求之後連接關閉。
- http1.1:當前瀏覽器客戶端與服務器端建立連接之後,可以在一次連接中發送多次請求。(基本都使用1.1)
請求資源:
- URL: 統一資源定位符。http://localhost:8080/myweb/index.jsp。只能定位互聯網資源。是URI 的子集。
- URI: 統一資源標記符。/myweb/index.jsp。用於標記任何資源。可以是本地文件系統,局域網的資源,也可以是互聯網資源。
請求方式:
常見的請求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE 等 。
常用的請求方式: , POST , DELETE , PUT , GET , 分別代表增刪改查。
請求頭
- Accept:用於告訴服務器,客戶機支持的數據類型
- Accept-Charset:用於告訴服務器,客戶機採用的編碼格式
- Accept-Encoding:用於告訴服務器,客戶機支持數據壓縮格式
- Accept-Language:客戶機的語言環境
- Host:客戶機通過這個頭告訴服務器,想訪問的主機名
- If-Modified-Since:客戶機通過這個頭告訴服務器,資源的緩存時間
- Refer:客戶機通過這個頭告訴服務器,它是從哪個資源訪問服務器的(防盜鏈)
- User-Agent:客戶機通過這個頭告訴服務器,客戶機的軟件環境
- Cookie:客戶機通過這個頭向服務器帶數據
- Connection:這個請求完了,是保持連接還是關閉
- Range:斷點下載
- bytes=n1-n2,傳輸範圍n1到n2字節
- bytes=n-,傳輸web資源中第n個字節以後的所有內容
- bytes=n,傳輸最後n個字節
- Date: 請求發出的時間
實體內容
- 只有POST提交的參數會放到實體內容中
http響應
- 同樣的,一個完整的HTTP響應包括:一個響應行、若干響應頭、以及實體內容
HTTP/1.1 200 OK //響應行
/*
*若干個響應頭(多個key-value對象)
*/
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 953
Date: Mon, 13 Feb 2017 07:04:33 GMT
//一個空行
/*
*(可選)實體內容
*/
響應行
http協議版本:
- 同上;
狀態碼: 服務器處理請求的結果(狀態):
狀態描述:
- 響應成功:OK
- 找不到資源:Not Found
- 等等
響應頭
- Location:這個頭配合302狀態碼使用,用於告訴客戶機找誰(location和302實現請求重定向)
- Server:服務器通過這個頭,告訴瀏覽器服務器的類型
- Content-Encoding:服務器通過這個頭,數據的壓縮格式
(相關java知識:GZIPOutputStream,包裝流/底層流) - Content-Length:服務器通過這個頭,告訴瀏覽器回送數據的長度
- Content-Type:服務器通過這個頭,告訴瀏覽器回送數據的類型
- Last-Modified:服務器通過這個頭,告訴瀏覽器當前資源的緩存時間
- Refresh:服務器通過這個頭,告訴瀏覽器隔多長時間刷新一次
- Content-Disposition:服務器通過這個頭,告訴瀏覽器以下載方式打開
- Transfer-Encoding:服務器通過這個頭,告訴瀏覽器數據的傳送格式
- Etag:緩存相關的頭部,用於實時性要求高的系統
- Expires:服務器通過這個頭,告訴瀏覽器把回送的資源緩存多長時間,-1或0則不緩存
- Cache-Control和Pragma:no-cache,服務器通過這兩個頭,也是控制瀏覽器不要緩存數據
- Connection:斷開連接/保持連接
- Date:當前時間
- Accept-Ranges:用來說明web服務器是否支持range。支持返回bytes;不支持返回none
- Content-Range:制定了返回web資源的字節範圍,格式:n1-n2/n_total