1. 程式人生 > >HTTP請求與響應協議

HTTP請求與響應協議

使用 6.0 agent 顯示 禁用 說明 含義 需要 保持

HTTP(hypertext transport protocol),即超文本傳輸協議。這個協議詳細規定了瀏覽器和萬維網服務器之間互相通信的規則

HTTP就是一個通信規則,通信規則規定了客戶端發送給服務器的內容格式,也規定了服務器發送給客戶端的內容格式。客戶端發送給服務器的格式叫“請求協議”;服務器發送給客戶端的格式叫“響應協議”

HTTP請求協議

請求協議的格式如下:

請求首行(方法——URI——協議/版本)
請求頭(key/value形式 頭信息:頭內容)
空行
請求體(GET方式沒有,POST方式有)

瀏覽器發送給服務器的內容需要遵循這個格式,如果不是這個格式服務器將無法解讀

我們現在使用的HTTP都是1.1版本的,最新的是HTTP/2版本,不過還沒有廣泛使用,在HTTP1.1規範中定義了7種類型的請求方法,包括GET,POST,HEAD,OPTIONS,PUT,DELETE以及TRACE,其中GETPOST較為常用

URI 定義了一個資源的位置,通常解析為服務器根目錄的相對路徑,因此是以"/"符號打頭,再提一點,URL是URI的一種具體類型

每個請求頭(header)都使用換行/回車(即CRLF)分割,請求頭和請求體正文之間使用一行空行分割,HTTP服務器據此判斷請求正文的起始位置

GET請求

GET /hello3/index.jsp HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Accept-Language: zh-CN,en-US;q=0.5
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; InfoPath.2; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: localhost
Connection: Keep-Alive
  • GET /hello/index.jsp HTTP/1.1:GET請求,請求服務器路徑為/hello/index.jsp,協議為1.1;
  • Host:localhost:請求的主機名為localhost;
  • User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:與瀏覽器和OS相關的信息。有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告訴服務器,當前客戶端可以接收的文檔類型,其實這裏包含了*/*,就表示什麽都可以接收;
  • Accept-Language: zh-cn,zh;q=0.5:當前客戶端支持的語言,可以在瀏覽器的工具選項中找到語言相關信息;
  • Accept-Encoding: gzip, deflate:支持的壓縮格式。數據在網絡上傳遞時,可能服務器會把數據壓縮後再發送;
  • Connection: keep-alive:客戶端支持的鏈接方式, keep-alive表示保持一段時間鏈接,默認為3000ms;

POST請求

先編寫一個表單項:

<form action="" method="post">
  關鍵字:<input type="text" name="keyword"/>
  <input type="submit" value="提交"/>
</form>

技術分享

輸入hello後點擊提交,查看請求內容如下:

POST /hello/index.jsp HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://localhost:8080/hello/index.jsp
Accept-Language: zh-cn,en-US;q=0.5
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 13
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=E365D980343B9307023A1D271CC48E7D

keyword=hello

POST請求是可以有體的,而GET請求不能有請求體。從POST請求正文(體)可以看到,表單雖然是一大堆內容,而發送給服務器的只有一行字符串,說明發送給服務器的內容只有一部分,可以減輕服務器壓力,也說明服務器只對某些數據感興趣

  • Referer: http://localhost:8080/hello/index.jsp:請求來自哪個頁面,例如你在百度上點擊鏈接到了這裏,那麽Referer:http://www.baidu.com;如果你是在瀏覽器的地址欄中直接輸入的地址,那麽就沒有Referer這個請求頭了;Referer請求頭是比較有用的一個請求頭,它可以用來做統計工作,也可以用來做防盜鏈
  • Content-Type: application/x-www-form-urlencoded:表示表單中的數據會自動使用url來編碼!url編碼的數據都是以“%”為前綴,後面跟隨兩位的16進制。在文件上傳中我們在form表單中使用 multipart/form-data 就是在修改 Content-Type的值
  • Content-Length:13:請求體的長度,這裏表示13個字節
  • keyword=hello:請求體內容!hello是在表單中輸入的數據,keyword是表單字段的名字

HTTP響應協議

同HTTP請求一樣,HTTP響應也包含3部分:

響應首行(協議/版本 狀態碼 狀態碼描述)
響應頭信息
空行 (同樣,響應頭和響應體之間有空行分割)
響應體

響應體內容是由服務器發送給瀏覽器的內容,瀏覽器會根據響應內容來顯示

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Content-Length: 724
Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello
Date: Wed, 25 Sep 2012 04:15:03 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://localhost:8080/hello/">
    
    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
<form action="" method="post">
  關鍵字:<input type="text" name="keyword"/>
  <input type="submit" value="提交"/>
</form>
  </body>
</html>
  • HTTP/1.1 200 OK:響應協議為HTTP1.1,狀態碼為200,表示請求成功,OK是對狀態碼的解釋;
  • Server: Apache-Coyote/1.1:服務器的版本信息
  • Content-Type: text/html;charset=UTF-8:響應體為html,並且使用的編碼為UTF-8
  • Content-Length: 724:響應體為724字節
  • Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello:響應給客戶端的Cookie
  • Date: Wed, 25 Sep 2012 04:15:03 GMT:響應的時間,這可能會有8小時的時區差

狀態碼

響應頭對瀏覽器來說很重要,它說明了響應的真正含義。例如200表示響應成功了,302表示重定向,這說明瀏覽器需要再發一個新的請求

  • 200:請求成功,瀏覽器會把響應體內容(通常是html)顯示在瀏覽器中;
  • 401:訪問未授權的資源;
  • 404:請求的資源沒有找到,說明客戶端錯誤的請求了不存在的資源(輸入了錯誤的頁面名稱);
  • 405:使用被禁用的請求方式
  • 500:請求資源找到了,但服務器內部出現了錯誤;
  • 302:重定向,當響應碼為302時,表示服務器要求瀏覽器重新再發一個請求,服務器會發送一個響應頭Location,它指定了新請求的URL地址;
  • 304:當用戶第一次請求index.html時,服務器會添加一個名為Last-Modified響應頭,這個頭說明了index.html的最後修改時間,瀏覽器會把index.html內容,以及最後響應時間緩存下來。當用戶第二次請求index.html時,在請求中包含一個名為If-Modified-Since請求頭,它的值就是第一次請求時服務器通過Last-Modified響應頭發送給瀏覽器的值,即index.html最後的修改時間,If-Modified-Since請求頭就是在告訴服務器,我這裏瀏覽器緩存的index.html最後修改時間是這個,您看看現在的index.html最後修改時間是不是這個,如果還是,那麽您就不用再響應這個index.html內容了,我會把緩存的內容直接顯示出來。而服務器端會獲取If-Modified-Since值,與index.html的當前最後修改時間比對,如果相同,服務器會發響應碼304,表示index.html與瀏覽器上次緩存的相同,無需再次發送,瀏覽器可以顯示自己的緩存頁面,如果比對不同,那麽說明index.html已經做了修改,服務器會響應200

差不多400系表示客戶端出現的問題,500系表示服務器端出現的問題,最喜歡的是200狀態碼了,表示響應成功

其他響應頭

禁用緩存

在HTML靜態頁面中,一般不禁用緩存,因為靜態頁面內容不變,緩存可以提升訪問效率(請求—響應302 再請求—響應200),但是JSP這樣的動態頁面,需要禁用緩存,因為經常變化(直接請求—響應200),就不增加302狀態碼的處理,提升效率

  • Expires: 0;
  • Cache-Control: no-cache;
  • Pragma: no-cache;

定時刷新

自動刷新響應頭,瀏覽器會在3秒之後請求www.baidu.com

Refresh: 3;url=http://www.baidu.com

HTML中指定響應頭

在HTMl頁面中可以使用<meta http-equiv="" content="">來指定響應頭,例如禁用緩存:

  <head>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
  </head>

HTTP請求與響應協議