1. 程式人生 > >深入淺出:HTTP請求方式

深入淺出:HTTP請求方式

網頁代碼 協議標準 通信速度 狀態碼 ie瀏覽器 實體 blog blank fff

HTTP協議(HyperText Transfer Protocol,超文本傳輸協議),HTTP協議位於應用層,由請求和響應構成。是用於從WWW服務器傳輸超文本到本地瀏覽器的傳輸協議。在Internet上的Web服務器上存放的都是超文本信息,客戶機需要通過HTTP協議傳輸所要訪問的超文本信息。

我們在瀏覽器的地址欄裏輸入的網站地址叫做URL (Uniform Resource Locator,統一資源定位符)。就像每家每戶都有一個門牌地址一樣,每個網頁也都有一個Internet地址。當你在瀏覽器的地址框中輸入一個URL或是單擊一個超級鏈接時,URL就確定了要瀏覽的地址。瀏覽器通過超文本傳輸協議(HTTP),將Web服務器上站點的網頁代碼提取出來,並翻譯成漂亮的網頁。
HTTP的請求模型:永遠都是客戶端發起請求,服務器回送響應。 技術分享圖片

HTTP協議的主要特點可概括如下:

支持客戶/服務器模式(CS)。

(1)簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。

(2)靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。

(3)無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。采用這種方式可以節省傳輸時間。

(4)無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。

技術分享圖片

HTTP請求方式

(1)get:獲取資源

get一般用於獲取/查詢資源信息,在瀏覽器中直接輸入url+請求參數點擊enter之後連接成功服務器就能獲取到的內容。

get方法用來請求已被URI識別的資源。指定的資源經服務器端解析後返回響應內容(也就是說,如果請求的資源是文本,那就保持原樣返回;如果是CGI [通用網關接口] 那樣的程序,則返回經過執行後的輸出結果)。
get方法最常用於向服務器查詢某些信息。必要時,可以將查詢字符串參數追加到URL末尾,以便將信息發送給服務器。使用GET請求時經常會發生的一個錯誤,就是查詢字符串的格式有問題。查詢字符串中每個參數的名稱和值都必須使用encodeURLComponent() (參考:

一張圖看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的區別進行編碼,然後才能放到URL的末尾;而且所有的名-值對都必須由(&)分離,如下面的例子:

xhr.open("get","01.php?name=foodoir&age=21",true);

下面這個函數可以輔助現有URL的末尾添加查詢字符串參數:

1   function addURLParam(url,name,value){
2         url += (url.indexOf("?") == -1 ? "?" : "&");
3         url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
4         return url;
5     }

這個addURLParam函數接受三個參數:要添加參數的URL、參數的名稱和參數的值。下面是使用這個函數來構建URL的示例:

1     var url = "example.php";
2     //添加參數
3     url = addURLParam(url,"name","foodoir");
4     url = addURLParam(url,"age","21");
5     //初始化請求
6     xhr.open("get",url,false);

GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在著安全隱患上。例如

Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB 從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大.

(2)POST:傳輸實體文本

POST方法用來傳輸實體的主體。雖然用GET方法也可以傳輸實體的主體,但一般不用GET方法進行傳輸,而是用POST方法;雖然GET方法和POST方法很相似,但是POST的主要目的並不是獲取響應的主體內容。POST請求的主體可以包含非常多的數據,而且格式不限。

在這裏我們來比較GET方法和POST方法本質上的區別:

1)GET方法用於信息獲取,它是安全的(安全:指非修改信息,如數據庫方面的信息),而POST方法是用於修改服務器上資源的請求;

2)GET請求的數據會附在URL之後,而POST方法提交的數據則放置在HTTP報文實體的主體裏,所以POST方法的安全性比GET方法要高;

3)GET方法傳輸的數據量一般限制在2KB,其原因在於:GET是通過URL提交數據,而URL本身對於數據沒有限制,但是不同的瀏覽器對於URL是有限制的,比如IE瀏覽器對於URL的限制為2KB,而Chrome,FireFox瀏覽器理論上對於URL是沒有限制的,它真正的限制取決於操作系統本身;POST方法對於數據大小是無限制的,真正影響到數據大小的是服務器處理程序的能力。

4)GET方法是默認的HTTP請求方法,我們日常用GET方法來提交表單數據,然而用GET方法提交的表單數據只經過了簡單的編碼,同時它將作為URL的一部分向Web服務器發送,因此,如果使用GET方法來提交表單數據就存在著安全隱患上。例如

Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB 從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的數據是作為URL請求的一部分所以提交的數據量不能太大。

5)POST方法是GET方法的一個替代方法,它主要是向Web服務器提交表單數據,尤其是大批量的數據。POST方法克服了GET方法的一些缺點。通過POST方法提交表單數據時,數據不是作為URL請求的一部分而是作為標準數據傳送給Web服務器,這就克服了GET方法中的信息無法保密和數據量太小的缺點。因此,出於安全的考慮以及對用戶隱私的尊重,通常表單提交時采用POST方法。

(3)HEAD:獲得報文首部
HEAD方法和GET方法一樣,只是不返回報文的主體部分,用於確認URI的有效性及資源更新的日期時間等。
具體來說:1、判斷類型; 2、查看響應中的狀態碼,看對象是否存在(響應:請求執行成功了,但無數據返回); 3、測試資源是否被修改過
HEAD方法和GET方法的區別: GET方法有實體,HEAD方法無實體。

(4)PUT:傳輸文件

PUT方法用來傳輸文件,就像FTP協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然後保存在請求URI指定的位置。但是HTTP/1.1的PUT方法自身不帶驗證機制,任何人都可以上傳文件,存在安全問題,故一般不用。

(5)DELETE:刪除文件

指明客戶端想讓服務器刪除某個資源,與PUT方法相反,按URI刪除指定資源

(6)OPTIONS:詢問支持的方法

OPTIONS方法用來查詢針對請求URI指定資源支持的方法(客戶端詢問服務器可以提交哪些請求方法)

(7)TRACE:追蹤路徑

客戶端可以對請求消息的傳輸路徑進行追蹤,TRACE方法是讓Web服務器端將之前的請求通信還給客戶端的方法

(8)CONNECT:要求用隧道協議連接代理

CONNECT方法要求在與代理服務器通信時建立隧道,實現用隧道協議進行TCP通信。主要使用SSL(安全套接層)和TLS(傳輸層安全)協議把通信內容加密後經網絡隧道傳輸。

以上部分參考:HTTP請求方法詳解

HTTP請求過程

一次完整的HTTP請求過程從TCP三次握手建立連接成功後開始,客戶端按照指定的格式開始向服務端發送HTTP請求,服務端接收請求後,解析HTTP請求,處理完業務邏輯,最後返回一個HTTP的響應給客戶端,HTTP的響應內容同樣有標準的格式。無論是什麽客戶端或者是什麽服務端,大家只要按照HTTP的協議標準來實現的話,那麽它一定是通用的。

HTTP 請求格式

HTTP請求格式主要有四部分組成,分別是:請求行、請求頭、空行、消息體,每部分內容占一行

1 <request-line>
2 <general-headers>
3 <request-headers>
4 <entity-headers>
5 <empty-line>
6 [<message-body>]

技術分享圖片

請求行:請求行是請求消息的第一行,由三部分組成:分別是請求方法(GET/POST/DELETE/PUT/HEAD)、請求資源的URI路徑、HTTP的版本號

1 GET /index.html HTTP/1.1

請求頭:請求頭中的信息有和緩存相關的頭(Cache-Control,If-Modified-Since)、客戶端身份信息(User-Agent)等等。例如:

1 Cache-Control:max-age=0
2 Cookie:gsScrollPos=; _ga=GA1.2.329038035.1465891024; _gat=1
3 If-Modified-Since:Sun, 01 May 2016 11:19:03 GMT
4 User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36

消息體:請求體是客戶端發給服務端的請求數據,這部分數據並不是每個請求必須的。

HTTP 響應格式

服務器接收處理完請求後返回一個HTTP相應消息給客戶端。HTTP響應消息的格式包括:狀態行、響應頭、空行、消息體。每部分內容占一行。

1 <status-line>
2 <general-headers>
3 <response-headers>
4 <entity-headers>
5 <empty-line>
6 [<message-body>]

技術分享圖片

狀態行:狀態行位於相應消息的第一行,有HTTP協議版本號,狀態碼和狀態說明三部分構成。如:

1 HTTP/1.1 200 OK

響應頭:響應頭是服務器傳遞給客戶端用於說明服務器的一些信息,以及將來繼續訪問該資源時的策略。

1 Connection:keep-alive
2 Content-Encoding:gzip
3 Content-Type:text/html; charset=utf-8
4 Date:Fri, 24 Jun 2016 06:23:31 GMT
5 Server:nginx/1.9.12
6 Transfer-Encoding:chunked

響應體:響應體是服務端返回給客戶端的HTML文本內容,或者其他格式的數據,比如:視頻流、圖片或者音頻數據。

以上部分參考:一次完整的 HTTP 請求過程

深入淺出:HTTP請求方式