1. 程式人生 > >HTTP協議的8種請求型別介紹

HTTP協議的8種請求型別介紹

HTTP協議中GET、POST和HEAD的介紹
2008-05-10 14:15
GET: 請求指定的頁面資訊,並返回實體主體。
HEAD: 只請求頁面的首部。
POST: 請求伺服器接受所指定的文件作為對所標識的URI的新的從屬實體。
PUT: 從客戶端向伺服器傳送的資料取代指定的文件的內容。
DELETE: 請求伺服器刪除指定的頁面。
OPTIONS: 允許客戶端檢視伺服器的效能。
TRACE: 請求伺服器在響應中的實體主體部分返回所得到的內容。
PATCH: 實體中包含一個表,表中說明與該URI所表示的原內容的區別。
MOVE: 請求伺服器將指定的頁面移至另一個網路地址。
COPY: 請求伺服器將指定的頁面拷貝至另一個網路地址。
LINK: 請求伺服器建立連結關係。
UNLINK: 斷開連結關係。
WRAPPED: 允許客戶端傳送經過封裝的請求。
Extension-mothed:在不改動協議的前提下,可增加另外的方法。


GET: 請求指定的頁面資訊,並返回實體主體。
 HEAD: 只請求頁面的首部。
 POST: 請求伺服器接受所指定的文件作為對所標識的URI的新的從屬實體。 





       HTTP 定義了與伺服器互動的不同方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST 僅用於更新站點。根據 HTTP 規範,GET 用於資訊獲取,而且應該是 安全的和冪等的。所謂安全的意味著該操作用於獲取資訊而非修改資訊。換句話說,GET 請求一般不應產生副作用。冪等的意味著對同一 URL 的多個請求應該返回同樣的結果。完整的定義並不像看起來那樣嚴格。從根本上講,其目標是當用戶開啟一個連結時,她可以確信從自身的角度來看沒有改變資源。 比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。反之亦然。POST 請求就不那麼輕鬆了。POST 表示可能改變伺服器上的資源的請求。仍然以新聞站點為例,讀者對文章的註解應該通過 POST 請求實現,因為在註解提交之後站點已經不同了(比方說文章下面出現一條註解);
在FORM提交的時候,如果不指定Method,則預設為GET請 求,Form中提交的資料將會附加在url之後,以?分開與url分開。字母數字字元原樣傳送,但空格轉換為“+“號,其它符號轉換為%XX,其中XX為 該符號以16進製表示的ASCII(或ISO Latin-1)值。GET請求請提交的資料放置在HTTP請求協議頭中,而POST提交的資料則放在實體資料中;
GET方式提交的資料最多隻能有1024位元組,而POST則沒有此限制。   

在表單裡使用”post”和”get”有什麼區別

在Form裡面,可以使用post也可以使用get。它們都是method的合法取值。但是,post和get方法在使用上至少有兩點不同:
1、Get方法通過URL請求來傳遞使用者的輸入。Post方法通過另外的形式。
2、Get方式的提交你需要用Request.QueryString來取得變數的值,而Post方式提交時,你必須通過Request.Form來訪問提交的內容。 
仔細研究下面的程式碼。你可以執行之來感受一下:

程式碼
<!--兩個Form只有Method屬性不同-->
<FORM ACTION=“getpost.asp” METHOD=“get”>
<INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT>
<INPUT TYPE=“submit” VALUE=“Method=Get”></INPUT>
</FORM>
<BR>
<FORM ACTION=“getpost.asp” METHOD=“post”>
<INPUT TYPE=“text” NAME=“Text” VALUE=“Hello World”></INPUT>
<INPUT TYPE=“submit” VALUE=“Method=Post”></INPUT>
</FORM>

<BR>
<BR>

<% If Request.QueryString(“Text”) <> ““ Then %>
通過get方法傳遞來的字串是: “<B><%= Request.QueryString(“Text”) %></B>“<BR>
<% End If %>

<% If Request.Form(“Text”) <> ““ Then %>
通過Post方法傳遞來的字串是: “<B><%= Request.Form(“Text”) %></B>“<BR>
<% End If %>

說明
把上面的程式碼儲存為getpost.asp,然後執行,首先測試post方法,這時候,瀏覽器的url並沒有什麼變化,返回的結果是:
通過Post方法傳遞來的字串是: "Hello World"
然後測試用get方法提交,請注意,瀏覽器的url變成了:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果是:
通過get方法傳遞來的字串是: "Hello World"
最後再通過post方法提交,瀏覽器的url還是:
http://localhost/general/form/getpost.asp?Text=Hello+World
而返回的結果變成:
通過get方法傳遞來的字串是: "Hello World"
通過Post方法傳遞來的字串是: "Hello World"

提示
通過get方法提交資料,可能會帶來安全性的問題。比如一個登陸頁面。當通過get方法提交資料時,使用者名稱和密碼將出現在URL上。如果:
1、 登陸頁面可以被瀏覽器快取;
2、 其他人可以訪問客戶的這臺機器。
那麼,別人即可以從瀏覽器的歷史記錄中,讀取到此客戶的賬號和密碼。所以,在某些情況下,get方法會帶來嚴重的安全性問題。
建議
在Form中,建議使用post方法。



如果用HEAD方法請求的話,則伺服器返回的只是響應標題,而不會返回被請求的文擋,HEAD方法通用於一些搜尋引擎

--------------------------------------------------------------------------------------------------------------------

GET: 請求指定的頁面資訊,並返回實體主體。
HEAD: 只請求頁面的首部。
POST: 請求伺服器接受所指定的文件作為對所標識的URI的新的從屬實體。
PUT: 從客戶端向伺服器傳送的資料取代指定的文件的內容。
DELETE: 請求伺服器刪除指定的頁面。
OPTIONS: 允許客戶端檢視伺服器的效能。
TRACE: 請求伺服器在響應中的實體主體部分返回所得到的內容。
PATCH: 實體中包含一個表,表中說明與該URI所表示的原內容的區別。
MOVE: 請求伺服器將指定的頁面移至另一個網路地址。
COPY: 請求伺服器將指定的頁面拷貝至另一個網路地址。
LINK: 請求伺服器建立連結關係。
UNLINK: 斷開連結關係。
WRAPPED: 允許客戶端傳送經過封裝的請求。
Extension-mothed:在不改動協議的前提下,可增加另外的方法。

比如:
GET /index.html HTTP/1.1
Accept: text/plain /*純ASCII碼文字檔案*/
Accept: text/html /*HTML文字檔案*/
User-Agent:Mozilla/4.5(WinNT)
說明瀏覽器使用Get方法請求文件/index.html。瀏覽器則只允許接收純ASCII碼文字檔案和HTML文字檔案,其使用的引擎是Mozilla/4.5(Netscape)。

當伺服器響應時,其狀態行的資訊為HTTP的版本號,狀態碼,及解釋狀態碼的簡單說明。現將5類狀態碼詳細列出:
① 客戶方錯誤
100  繼續
101  交換協議
② 成功
200  OK
201  已建立
202  接收
203  非認證資訊
204  無內容
205  重置內容
206  部分內容
③ 重定向
300  多路選擇
301  永久轉移
302  暫時轉移
303  參見其它
304  未修改(Not Modified)
305  使用代理
④ 客戶方錯誤
400  錯誤請求(Bad Request)
401  未認證
402  需要付費
403  禁止(Forbidden)
404  未找到(Not Found)
405  方法不允許
406  不接受
407  需要代理認證
408  請求超時
409  衝突
410  失敗
411  需要長度
412  條件失敗
413  請求實體太大
414  請求URI太長
415  不支援媒體型別
⑤ 伺服器錯誤
500  伺服器內部錯誤
501  未實現(Not Implemented)
502  閘道器失敗
504  閘道器超時
505 HTTP版本不支援
比如:(在《TELNET……》一文中用telnet登陸80埠,相同的方法用在HTTP/1.1中,會發現沒有顯示,下面補充說明之)
telnet www.fudan.edu.cn 80
HEAD / HTTP/1.1
host:www.fudan.edu.cn /*本行為輸入內容*/
HTTP/1.1 501 Method Not Implemented
Date: Web, 01 Nov 2000 07:12:29 GMT /*當前的日期/時間*/
Server: Apache/1.3.12 (Unix) /*Web伺服器資訊*/
Allow: GET, HEAD, OPTION, TRACE /*支援的方法型別*/
Connection: close 
Connect-Type: Text/html; charset=iso-8859-1/*連線的媒體型別*/

<!DOCTYPE HTML PUBLIG "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>501 Method
Not Implemented</TITLE>
</HEAD><BODY>
<H1>Method Not Implemented</H1>
head to /inde
x.html not supported.<P>
Invalid method in request head / htp/1.1<P>
<HR>
<ADDRESS>
Apache/1.3.12 Server at www.fudan.edu.cn Port 80</ADDRESS>
</BODY></HTML>
關於實體頭部的內容還可以有:
Last Modified :請求文件的最近修改時間。
Expires :請求文件的過期時間。
Connect-length:文件資料的長度。
WWW-authenricate:通知客戶端需要的認證資訊。 
Connect-encoding :說明有無使用壓縮技術。
Transfer-encoding :說明採用的編碼變換型別。

隨著Internet的發展,下一代的HTTP協議HTTP-ng已經在醞釀之中,它將會提供更好的安全性、更快的速度,其改進要點為:模組化強、網路效率高、安全性更好、結構更簡單。