HTTP協議的幾種請求方法


轉:http://blog.chinaunix.net/uid-21778123-id-1815443.html

【問題的引入】
  以前知道HTTP有GET和POST兩種請求方法,並且都見過,但印象里兩者差不多,可以混着用。最近要進一步研究這個問題,才發現原來的想法不對。
  不對有兩點:1,GET和POST區別很大; 2,HTTP有不止這兩種請求方法。

【GET和POST的區別】
  首先要明白,這兩者區別很大,數據在傳輸和處理的過程也不一樣,程序設計者必須完全明白其區別,才能設計出合理的web程序。以下內容參考了文章GET和POST的本質區別是什么?

(1)使用范圍的區別:

 使用GET時,form中的數據集(如input框的value)將被編碼到URL中,作為URL的一部分。而使用POST時,form中的數據集則被編碼到http協議的header中,構造成消息發送。在使用上,當且僅當請求是冪等(請求任意次都返回同樣的結果)時使用GET,而當請求會改變服務器數據或狀態時使用POST。當程序設計人員正確的使用GET,POST時,瀏覽器會給出更好的緩存配合,使響應速度更快。

(2)在form提交階段的差別:

form 提交的第一步是創建數據集,並根據 ENCTYPE 指定的類型值對數據集進行編碼。 ENCTYPE 有兩個值:multipart/form-data,application/x-www-form-urlencoded(默認值)。form提交的第 二步是進行數據傳輸。對於GET方法,數據集使用application/x-www-form-urlencoded編碼;而對於POST方法,數據集 的 ENCTYPE 可以指定。

application/x-www-form-urlencoded對form數據集的編碼規則:(1)如果是字母或數字,則直接使用其ascii碼的十六進制。(2)對於非字母也非數字的字符,則不僅使用其ascii碼的十六進制,還要在前面加上“%”。比如“\”,它的ascii碼是92,92的十六進制是5c,所以“\”的urlencoded編碼就是%5c。相應的解碼函數(轉載)如下:

/**
* 用C語言實現URL解密
* QQ:339534039
* 日期:2006.11.29
*/
void urldecode(char *p)
{
register i=0;
while(*(p+i))
{
   if ((*p=*(p+i)) == '%')
   {
    *p=*(p+i+1) >= 'A' ? ((*(p+i+1) & 0XDF) - 'A') + 10 : (*(p+i+1)- '0');
    *p=(*p) * 16;
    *p+=*(p+i+2) >= 'A' ? ((*(p+i+2) & 0XDF) - 'A') + 10 :(*(p+i+2) - '0');
    i+=2;
   }
   else if (*(p+i)=='+')
   {
    *p=' ';
   }
   p++;
}
*p='\0';
}

 

(3)服務器端處理差別:

       原則上,處理GET和POST請求是沒有分別的。但由於數據通過不同的方法編碼,需要有不同的解碼機制。所以,方法變化將導致處理請求的代碼變化。比如對 於cgi,處理GET時通過環境變量獲得參數,處理POST請求時則通過標准輸入(stdin) 獲得數據。

(4)實際使用經驗的總結:

       1、get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過 HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。

       2、對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。兩種方式的參數都可以用Request來獲得。

       3、get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。

       4、get安全性非常低,post安全性較高。

       5、

跟是一樣的,也就是說,action頁面后邊帶的參數列表會被忽視;而跟是不一樣的。

【HTTP的各種請求方法】

       以下內容引自:http://blog.chinaunix.net/u2/82392/showart_1724853.html

       客 戶程序向服務器發送的請求可以有不同的類型,這樣服務器可以根據不同的請求類型進行不同的處理。在HTTP1.0中,定義了三種最基本的請求類 型,GET、POST和HEAD,這些請求方法的實現方式均與上例相同,客戶程序用大寫指令將請求發送給服務器,后面跟隨具體的數據。

       其 中,HEAD請求在客戶程序和服務器之間進行交流,而不會返回具體的文檔。當使用GET和POST方法時,服務器最后都將結果文檔返回給客戶程序,瀏覽器 將 刷新顯示。而HEAD請求則不同,它僅僅交流一些內部數據,這些數據不會影響瀏覽的過程。因此HEAD方法通常不單獨使用,而是和其他的請求方法一起起到 輔助作用。一些搜尋引擎使用的自動搜索機器人使用這個方法來獲得網頁的標志信息,或者進行安全認證時,使用這個方法來傳遞認證信息。

       除了這三種最常見的訪問方法之外,在HTTP1.1中還定義了更多的訪問方法類型,如PUT,用於將網頁放置到正確位置,DELETE用於刪除相關文檔 等。這些方法並不常用,因而大部分Web服務器軟件並沒有實現他們。然而對於特定場合他們還是非常有用的,例如使用軟件編輯網頁時,網頁編輯器可以使用這 些方法,管理不同的網頁。
       如果服務器不支持客戶發送的請求方法,服務器將返回錯誤並立即關閉連接。
 
<--文章完-->


免責聲明!

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



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