標籤:
HTTP要求方法詳解
要求方法:指定了用戶端想對指定的資源/伺服器作何種操作
下面我們介紹HTTP/1.1中可用的要求方法:
【GET:擷取資源】
GET方法用來請求已被URI識別的資源。指定的資源經伺服器端解析後返迴響應內容(也就是說,如果請求的資源是文本,那就保持原樣返回;如果是CGI[通用閘道介面]那樣的程式,則返回經過執行後的輸出結果)。
最常用於向伺服器查詢某些資訊。必要時,可以將查詢字串參數追加到URL末尾,以便將資訊發送給伺服器。
使用GET請求時經常會發生的一個錯誤,就是查詢字串的格式有問題。查詢字串中每個參數的名稱和值都必須使用encodeURLComponent()進行編碼,然後才能放到URL的末尾;而且所有的名-值對都必須由(&)分離,如下面的例子:
xhr.open("get","01.php?name=foodoir&age=21",true);
下面這個函數可以輔助現有URL的末尾添加查詢字串參數:
function addURLParam(url,name,value){ url += (url.indexOf("?") == -1 ? "?" : "&"); url += encodeURIComponent(name) + "=" + encodeURIComponent(value); return url; }
這個addURLParam函數接受三個參數:要添加參數的URL、參數的名稱和參數的值。
下面是使用這個函數來構建URL的樣本
var url = "example.php"; //添加參數 url = addURLParam(url,"name","foodoir"); url = addURLParam(url,"age","21"); //初始化請求 xhr.open("get",url,false);
【POST:傳輸實體文本】
POST方法用來傳輸實體的主體。
雖然用GET方法也可以傳輸實體的主體,但一般不用GET方法進行傳輸,而是用POST方法;雖然GET方法和POST方法很相似,但是POST的主要目的並不是擷取響應的主體內容。
POST請求的主體可以包含非常多的資料,而且格式不限。下面舉一個例子:
xhr.open("post","01.php",true);
發送POST請求的第二步就是向send方法中傳入某些資料,由於XHR最初的設計是為了處理XML,因此也可以在此處理XML DOM文檔,傳入的文檔經過序列化之後將作為請求主體被提交到伺服器。
預設情況下,伺服器對於POST請求和提交WEB表單的請求並不會一視同仁,我們來看下面一段代碼:
function(){ var xhr = CreateXHR(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){//檢測XHR的readyState屬性 if((xhr.status >= 200 && xhr.status <= 300) || xhr.status == 304){ alert(xhr.responseText); }else{ alert("Request was unsuccessful:" + xhr.status); } } }; xhr.open("post","post.php",true); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); var form = document.getElementById("ID"); xhr.send(serialize(form));}
我們可以模仿XHR表單提交:首先將Content-Type頭部資訊設定為application/x-www-form-urlencoded,也就是表單提交時的類型,其次是以適當的格式建立一個字串(POST資料格式與查詢字串的格式相同),如果需要將頁面中表單的資料進行序列化,然後再通過XHR函數發送到伺服器,那麼可以使用序列化函數serialize(),(表單序列化,這裡不作具體介紹)
在這裡我們來比較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方法對於資料大小是無限制的,真正影響到資料大小的是伺服器處理常式的能力。
【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方法要求在與Proxy 伺服器通訊時建立隧道,實現用隧道協議進行TCP通訊。主要使用SSL(安全套接層)和TLS(傳輸層安全)協議把通訊內容加密後經網路隧道傳輸。
更多參考資料:
《Javascript進階程式設計(第三版)》第21章;
《圖解HTTP》第二章;
HTTP要求方法詳解