HTTP請求方法詳解


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

更多參考資料:

  《Javascript高級程序設計(第三版)》第21章;

  《圖解HTTP》第二章;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM