HTTP協議概述

1、HTTP簡介

HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。javascript

HTTP是一個基於TCP/IP通訊協議來傳遞數據(HTML 文件, 圖片文件,查詢結果等)。css

HTTP是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統。HTTP協議工做於客戶端-服務端架構爲上。瀏覽器做爲HTTP客戶端經過URL向HTTP服務端即WEB服務器發送全部請求。Web服務器根據接收到的請求後,向客戶端發送響應信息。html

HTTP的主要特色:java

一、簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法經常使用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯繫的類型不一樣。因爲HTTP協議簡單,使得HTTP服務器的程序規模小,於是通訊速度很快。web

二、靈活:HTTP容許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。chrome

三、無鏈接:無鏈接的含義是限制每次鏈接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開鏈接。採用這種方式能夠節省傳輸時間。json

四、無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺乏狀態意味着若是後續處理須要前面的信息,則它必須重傳,這樣可能致使每次鏈接傳送的數據量增大。另外一方面,在服務器不須要先前信息時它的應答就較快。瀏覽器

五、支持B/S及C/S模式。緩存

HTTP之URL:服務器

HTTP使用統一資源標識符(Uniform Resource Identifiers, URI)來傳輸數據和創建鏈接。統一資源定位符(UniformResourceLocator,URL)是一種特殊類型的URI,包含了用於查找某個資源的足夠的信息,是互聯網上用來標識某一處資源的地址。
如下面這個URL爲例,介紹下普通URL的各部分組成:
http://www.baidu.com:80/search/s?wd=url&ie=utf-8&tn=SE_PSStatistics_p1d9m0nf#name

從上面的URL能夠看出,一個完整的URL包括如下幾部分:
一、協議部分:該URL的協議部分爲「http:」,這表明網頁使用的是HTTP協議。在Internet中可使用多種協議,如HTTP,FTP等等本例中使用的是HTTP協議。在"HTTP"後面的「//」爲分隔符;
二、域名部分:該URL的域名部分爲「www.baidu.com」。一個URL中,也可使用IP地址做爲域名使用;
三、端口部分:跟在域名後面的是端口,域名和端口之間使用「:」做爲分隔符。端口不是一個URL必須的部分,若是省略端口部分,將採用默認端口80;
四、虛擬目錄部分:從域名後的第一個「/」開始到最後一個「/」爲止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是「/search/」;
五、文件名部分:從域名後的最後一個「/」開始到「?」爲止,是文件名部分,若是沒有「?」,則是從域名後的最後一個「/」開始到「#」爲止,是文件部分,若是沒有「?」和「#」,那麼從域名後的最後一個「/」開始到結束,都是文件名部分。本例中的文件名是「s」。文件名部分也不是一個URL必須的部分,若是省略該部分,則使用默認的文件名;
六、參數部分:從「?」開始到「#」爲止之間的部分爲參數部分,又稱搜索部分、查詢部分。本例中的參數部分爲「wd=url&ie=utf-8&tn=SE_PSStatistics_p1d9m0nf」。參數能夠容許有多個參數,參數與參數之間用「&」做爲分隔符。
七、錨部分:從「#」開始到最後,都是錨部分。本例中的錨部分是「name」。錨部分也不是一個URL必須的部分;

上面的URL能夠簡寫爲http://www.baidu.com/s?wd=url,也能夠訪問到數據。

2、HTTP Request

客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:

請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。

請求行以一個方法符號開頭,以空格分開,後面跟着請求的URI和協議的版本。

GET請求例子,使用Fiddler抓取的request:

https://www.baidu.com/s?wd=url
客戶端請求:
GET /s?wd=url HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.48 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,id;q=0.7
Cookie: BAIDUID=FB1F9E174367B4FEA9808A2758FC9120:FG=1; BIDUPSID=FB1F9E174367B4FEA9808A2758FC9120; PSTM=1536716563; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; MSA_WH=360_640; lsv=globalTjs_7a56b8a-wwwTcss_978f62a-wwwBcss_480c272-framejs_1983a82-globalBjs_3aafc04-sugjs_86ad242-wwwjs_4e66662; H_WISE_SIDS=126087_125822_125794_125807_124692_124475_125650_124610_125897_120160_118880_118860_118839_118818_118786_107320_125544_125007_117327_124978_117432_125776_125926_125652_124939_125172_125709_126092_125852_126055_124035_125058_110085_123290_125645_125874_125451; plus_cv=1::m:d03af37f; BDRCVFR[t8qxwL5sMGc]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=2; BDRCVFR[M7pOaqtZgJR]=I67x6TjHwwYf0; H_PS_PSSID=26523_1434_26964_21080_18560_22159; H_PS_645EC=041dGI532V5Qr06mZYBIPdPhh7h0POnOmQuxoRfNHNnDCnisahtbf78BAHc; BDSVRTM=0; pgv_pvi=9362056192; pgv_si=s7875444736

第一部分:請求行,即第一行,用來講明請求類型,要訪問的資源以及所使用的HTTP版本。
GET說明請求類型爲GET,[/s?wd=url]爲要訪問的資源,該行的最後一部分說明使用的是HTTP 1.1版本。
第二部分:請求頭部,從第二行起,用來講明服務器要使用的附加信息。
HOST將指出請求的目的地,User-Agent,服務器端和客戶端腳本都能訪問它,它是瀏覽器類型檢測邏輯的重要基礎。該信息由你的瀏覽器來定義,而且在每一個請求中自動發送等等。
第三部分:空行,請求頭部後面的空行是必須的。即便第四部分的請求數據爲空,也必須有空行。
第四部分:請求數據也叫主體,能夠添加任意的其餘數據。這個例子的請求數據爲空。

POST請求例子,使用Fiddler抓取的request:

https://zhidao.baidu.com/business/submit/onbusinessbrowse
客戶端請求:
POST /business/submit/onbusinessbrowse HTTP/1.1
Host: zhidao.baidu.com
Connection: keep-alive
Content-Length: 146
Pragma: no-cache
Cache-Control: no-cache
Origin: https://zhidao.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.48 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
X-ik-token: fb5f224884c6656a54ebc8a349efda5a
X-ik-ssl: 1
Referer: https://zhidao.baidu.com/question/12717124.html?hideOtherAnswer=true
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,id;q=0.7
Cookie: BAIDUID=FB1F9E174367B4FEA9808A2758FC9120:FG=1; BIDUPSID=FB1F9E174367B4FEA9808A2758FC9120; PSTM=1536716563; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_WISE_SIDS=126087_125822_125794_125807_124692_124475_125650_124610_125897_120160_118880_118860_118839_118818_118786_107320_125544_125007_117327_124978_117432_125776_125926_125652_124939_125172_125709_126092_125852_126055_124035_125058_110085_123290_125645_125874_125451; BDRCVFR[t8qxwL5sMGc]=mk3SLVN4HKm; PSINO=2; BDRCVFR[M7pOaqtZgJR]=I67x6TjHwwYf0; pgv_pvi=9362056192; pgv_si=s7875444736; H_PS_PSSID=26523_1434_21080_18560_22159; ZD_ENTRY=baidu; Hm_lvt_6859ce5aaf00fb00387e6434e4fcc925=1537170710,1537928534,1537932933,1538040431; BDUSS=plbXhMdzQ2eFRnODVjWGtZcEhSeGttVTNodEVXekh3dFRuY3BhbGRtUDBMOVJiQVFBQUFBJCQAAAAAAAAAAAEAAACpgSAjbmV3bW9ybmluZzIwMTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPSirFv0oqxbek; Hm_lpvt_6859ce5aaf00fb00387e6434e4fcc925=1538040575

第一部分:請求行,第一行講明瞭是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第十七行。
第三部分:空行,第十八行的空行。
第四部分:請求數據,空。

3、HTTP Response

通常狀況下,服務器接收並處理客戶端發過來的請求後會返回一個HTTP的響應消息。
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。
一個例子:
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8

<html> <head></head> <body> <!--body goes here--> </body> </html>
第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
第一行爲狀態行,HTTP/1.1代表HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲ok。
第二部分:消息報頭,用來講明客戶端要使用的一些附加信息,第二行和第三行爲消息報頭。
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8。
第三部分:空行,消息報頭後面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。空行後面的html部分爲響應正文。

在第二部分裏的GET和POST的請求的響應見下,也都沒有響應正文。
https://www.baidu.com/s?wd=url
服務端響應:
HTTP/1.1 200 OK
Bdpagetype: 3
Bdqid: 0xa58c743d001461df
Cache-Control: private
Ckpacknum: 2
Ckrndstr: d001461df
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Thu, 27 Sep 2018 08:35:41 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; expires=Sat, 19-Sep-2048 08:35:41 GMT
Set-Cookie: BD_CK_SAM=1;path=/
Set-Cookie: PSINO=2; domain=.baidu.com; path=/
Set-Cookie: BDSVRTM=19; path=/
Set-Cookie: H_PS_PSSID=26523_1434_21080_18560_22159; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked


https://zhidao.baidu.com/business/submit/onbusinessbrowse
服務端響應:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: X-ik-ssl,X-ik-token,X-ik-utdata
Access-Control-Allow-Origin: https://zhidao.baidu.com
Access-Control-Max-Age: 1728000
Connection: keep-alive
Content-Type: application/json;
Date: Thu, 27 Sep 2018 09:29:41 GMT
Server: Apache
Wait: 2
Content-Length: 68

4、HTTP消息頭參數

一、HTTP之請求方法

HTTP 1.0定義了三種請求方法: GET、POST 和 HEAD方法。

HTTP 1.1新增了五種請求方法:OPTIONS、 PUT、 DELETE、TRACE 和 CONNECT 方法。見rfc2616:https://www.w3.org/Protocols/rfc2616/rfc2616.html

序號 方法 描述
1 GET 請求指定的頁面信息,並返回實體主體。
2 HEAD 相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5 DELETE 請求服務器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器
7 OPTIONS 容許客戶端查看服務器的性能。
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷。

二、HTTP之狀態碼

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操做
4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態碼:
200 OK //客戶端請求成功 400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解 401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 403 Forbidden //服務器收到請求,可是拒絕提供服務 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error //服務器發生不可預期的錯誤 503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
更多狀態碼:https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

三、響應頭信息

應答頭 說明
Allow

服務器支持哪些請求方法(如GET、POST等)。

Content-Encoding

文檔的編碼(Encode)方法。只有在解碼以後才能夠獲得Content-Type頭指定的內容類型。利用gzip壓縮文檔可以顯著地減小HTML文檔的下載時間。Java的GZIPOutputStream能夠很方便地進行gzip壓縮,但只有Unix上的Netscape和Windows上的IE 四、IE 5才支持它。所以,Servlet應該經過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip,爲支持gzip的瀏覽器返回經gzip壓縮的HTML頁面,爲其餘瀏覽器返回普通頁面。

Content-Length

表示內容長度。只有當瀏覽器使用持久HTTP鏈接時才須要這個數據。若是你想要利用持久鏈接的優點,能夠把輸出文檔寫入 ByteArrayOutputStream,完成後查看其大小,而後把該值放入Content-Length頭,最後經過byteArrayStream.writeTo(response.getOutputStream()發送內容。

Content-Type

表示後面的文檔屬於什麼MIME類型。Servlet默認爲text/plain,但一般須要顯式地指定爲text/html。因爲常常要設置Content-Type,所以HttpServletResponse提供了一個專用的方法setContentType。

Date

當前的GMT時間。你能夠用setDateHeader來設置這個頭以免轉換時間格式的麻煩。

Expires

應該在何時認爲文檔已通過期,從而再也不緩存它?

Last-Modified

文檔的最後改動時間。客戶能夠經過If-Modified-Since請求頭提供一個日期,該請求將被視爲一個條件GET,只有改動時間遲於指定時間的文檔纔會返回,不然返回一個304(Not Modified)狀態。Last-Modified也可用setDateHeader方法來設置。

Location

表示客戶應當到哪裏去提取文檔。Location一般不是直接設置的,而是經過HttpServletResponse的sendRedirect方法,該方法同時設置狀態代碼爲302。

Refresh

表示瀏覽器應該在多少時間以後刷新文檔,以秒計。除了刷新當前文檔以外,你還能夠經過setHeader("Refresh", "5; URL=http://host/path")讓瀏覽器讀取指定的頁面。 
注意這種功能一般是經過設置HTML頁面HEAD區的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">實現,這是由於,自動刷新或重定向對於那些不能使用CGI或Servlet的HTML編寫者十分重要。可是,對於Servlet來講,直接設置Refresh頭更加方便。 

注意Refresh的意義是"N秒以後刷新本頁面或訪問指定頁面",而不是"每隔N秒刷新本頁面或訪問指定頁面"。所以,連續刷新要求每次都發送一個Refresh頭,而發送204狀態代碼則能夠阻止瀏覽器繼續刷新,不論是使用Refresh頭仍是<META HTTP-EQUIV="Refresh" ...>。 

注意Refresh頭不屬於HTTP 1.1正式規範的一部分,而是一個擴展,但Netscape和IE都支持它。

Server

服務器名字。Servlet通常不設置這個值,而是由Web服務器本身設置。

Set-Cookie

設置和頁面關聯的Cookie。Servlet不該使用response.setHeader("Set-Cookie", ...),而是應使用HttpServletResponse提供的專用方法addCookie。參見下文有關Cookie設置的討論。

WWW-Authenticate

客戶應該在Authorization頭中提供什麼類型的受權信息?在包含401(Unauthorized)狀態行的應答中這個頭是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 
注意Servlet通常不進行這方面的處理,而是讓Web服務器的專門機制來控制受密碼保護頁面的訪問(例如.htaccess)。

四、常見的媒體格式類型

    text/html : HTML格式
    text/plain :純文本格式     
    text/xml :  XML格式
    image/gif :gif圖片格式   
    image/jpeg :jpg圖片格式
    image/png:png圖片格式
   以application開頭的媒體格式類型:
   application/xhtml+xml :XHTML格式
   application/xml     : XML數據格式
   application/atom+xml  :Atom XML聚合格式   
   application/json    : JSON數據格式
   application/pdf       :pdf格式 
   application/msword  : Word文檔格式
   application/octet-stream : 二進制流數據(如常見的文件下載)
   application/x-www-form-urlencoded :默認的encType,form表單數據被編碼爲key/value格式發送到服務器(表單默認的提交數據的格式)
   另一種常見的媒體格式是上傳文件之時使用的:
    multipart/form-data : 須要在表單中進行文件上傳時,就須要使用該格式

                          

------------------------------------------------------Tanwheey--------------------------------------------------

愛生活,愛工做。

相關文章
相關標籤/搜索