HTTP請求格式
當瀏覽器向Web服務器發出請求時,它向服務器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:
- 請求方法 URI協議 版本
- 請求頭(Request Header)
- 請求正文
下面是一個HTTP請求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
(1) 請求方法URI協議/版本
請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1
以上代碼中“GET”代表請求方法,“/sample.jsp”表示URI,“HTTP/1.1代表協議和協議的版本。
根據HTTP標准,HTTP請求可以使用多種請求方法。例如:HTTP1.1支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。
URL完整地指定了要訪問的網絡資源,通常只要給出相對於服務器的根目錄的相對目錄即可,因此總是以“/”開頭,最后,協議版本聲明了通信過程中使用HTTP的版本。
(2)請求頭(Request Header)
請求頭包含許多有關的客戶端環境和請求正文的有用信息。例如,請求頭可以聲明瀏覽器所用的語言,請求正文的長度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
請求字段分析:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8表示客戶端可以接受的內容類型,多個值使用;分號隔開q=0.9 表示權重優先級,*/*表示可以接受任意類型內容;
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3表示客戶端可以接受的語言
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64x64;
瀏覽器信息,例如使用的是網井的內核, windows64位系統;
Accept-Encoding: gzip, deflate–>>支持的壓縮格式
Host: localhost:8888====>訪問地址
Connection: keep-alive —>>保持連接 和HTTP1.1版本有關,默認保持3s
Content-Type: application/x-www-form-urlencoded表單提交時才有可能出現,表示表單的數據類型,使用url編碼,url編碼 % 16位數
Content-Length: 7—>post請求 請求體長度
Upgrade-Insecure-Requests: 1–>>告訴服務器,瀏覽器可以處理https協議、
(3)請求正文
請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。
HTTP響應格式
HTTP響應也由3個部分構成,分別是:
- 協議/版本 狀態碼 描述
- 響應頭(Response Header)
- 響應正文
下面是一個HTTP響應的例子:
HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
<html>
<head>
<title>HTTP響應示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
(1)協議/版本 狀態碼 描述
協議版本狀態代碼描述HTTP響應的第一行類似於HTTP請求的第一行,它表示通信所用的協議是HTTP1.1服務器已經成功的處理了客戶端發出的請求(200表示成功):
HTTP/1.1 200 OK
(2)響應頭
(Response Header)響應頭也和請求頭一樣包含許多有用的信息,例如服務器類型、日期時間、內容類型和長度等:
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
響應頭字段分析
server: Apache-Coyote/1.1—>> 服務器版本號
Set-Cookie:JSESSIONID=ECA8005D1235BBB6B9CFCC338A8206FD; Path=/03test; HttpOnly
Content-Type: text/html;charset=utf-8響應字符集,告訴瀏覽器以什么樣的字符集解碼;
Content-Length: 265 響應體長度
Date: Fri, 23 Jun 2017 13:45:01 GMT 發送日期 少8個小時;
Expires: -1、Cache-control:no-cache、Pragma:no-cache三個響應頭一起使用, 表示禁止瀏覽器緩存當前頁面. 每個瀏覽器廠商對認識的禁止頭不同因此三個一起使用。
(3)響應正文
<html>
<head>
<title>HTTP響應示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>
響應頭和正文之間也必須用空行分隔。
HTTP應答碼
HTTP應答碼也稱為狀態碼,它反映了Web服務器處理HTTP請求狀態。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的類型:
1XX-信息類(Information),表示收到Web瀏覽器請求,正在進一步的處理中
2XX-成功類(Successful),表示用戶請求被正確接收,理解和處理例如:200 OK
3XX-重定向類(Redirection),表示請求沒有成功,客戶必須采取進一步的動作。
4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOTFound,意味着請求中所引用的文檔不存在。
5XX-服務器錯誤(Server Error)表示服務器不能完成對請求的處理:如 500
詳細的請求狀態碼:https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
HTTP請求方法
【GET:獲取資源】
GET方法用來請求已被URI識別的資源。指定的資源經服務器端解析后返回響應內容(也就是說,如果請求的資源是文本,那就保持原樣返回;如果是CGI[通用網關接口]那樣的程序,則返回經過執行后的輸出結果)。
【POST:傳輸實體文本】
POST方法用來傳輸實體的主體。
雖然用GET方法也可以傳輸實體的主體,但一般不用GET方法進行傳輸,而是用POST方法;雖然GET方法和POST方法很相似,但是POST的主要目的並不是獲取響應的主體內容。
【HEAD:獲得報文首部】
HEAD方法和GET方法一樣,知識不返回豹紋的主體部分,用於確認URI的有效性及資源更新的日期時間等。
具體來說:1、判斷類型; 2、查看響應中的狀態碼,看對象是否存在(響應:請求執行成功了,但無數據返回); 3、測試資源是否被修改過
HEAD方法和GET方法的區別: GET方法有實體,HEAD方法無實體。
【PUT:傳輸文件】
PUT方法用來傳輸文件,就像FTP協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然后保存在請求URI指定的位置。但是HTTP/1.1的PUT方法自身不帶驗證機制,任何人都可以上傳文件,存在安全問題,故一般不用。
【DELETE:刪除文件】
指明客戶端想讓服務器刪除某個資源,與PUT方法相反,按URI刪除指定資源
【OPTIONS:詢問支持的方法】
OPTIONS方法用來查詢針對請求URI指定資源支持的方法(客戶端詢問服務器可以提交哪些請求方法)
【TRACE:追蹤路徑】
客戶端可以對請求消息的傳輸路徑進行追蹤,TRACE方法是讓Web服務器端將之前的請求通信還給客戶端的方法
【CONNECT:要求用隧道協議連接代理】
CONNECT方法要求在與代理服務器通信時建立隧道,實現用隧道協議進行TCP通信。主要使用SSL(安全套接層)和TLS(傳輸層安全)協議把通信內容加密后經網絡隧道傳輸。