2012年7月19日 星期四

{Knowledge} Http 網頁執行的方法Get、Post

Http(Hypertext Transfer Protocol)是一種通訊協定,用於網頁發出請求(Request)給伺服器(Web Server)

往返瀏覽器、伺服器 傳輸埠
Https->443 Port
Http-->80 Port

Http Method分為9種,分別為OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT、DEBUG,其中Get、Post是可以將資料送到IIS(Web Server)端

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

Get:
使用GET的方法會將表單資訊附加在URL上並作為QueryString的一部分,QueryString是一種key/value的組合,從問號「?」開始,每一組值都是用「&」隔開,這是一種不安全的方法,具有高風險性。有心的人可以透過操控QueryString字串的方式來取得或破壞資料庫的資料

QueryString長度不能高過1,024個字元,但可在ASP.NET在4.0的版本中設定maxRequestPathLength、maxQueryStringLength這二個參數以擴大值

使用GET,如果request的網址沒有變動,則Result會是cache的,這意謂著我們取得的不見得是最新的資訊

結論:Get就像是明信片,將內容寫在外觀上(Request Headers),是容易被看見的,但也是比較便宜


Post
使用POST方法是將要傳送的資訊放在message-body中,就不用擔心資料大小的限制,可以防止使用者操作瀏覽器網址,表單的資料被隱藏在message-body中,因此,在大多數的情況下,使用POST方法將表單資料傳到Web Server端是更有效的方法,但也相對傳輸資料量大就會較慢

結論:Post就像一封信,內裝內容物(Request Body),容量比較大,但也比較貴比較沉重

差異:
在Request Headers/Request Body兩個也有差別,主要是POST有透過Send將資料送出去,因此Content-Length跟Body中都有內容,而GET則沒有,也 因此衍生了一些差異,POST因為要多送Request Body中的內容,若以達到相同功能來說,GET會比POST快一些。

--------------------------------------------------------------
使用XMLHttpRequest物件來看
XMLHttpRequest XHR=new XMLHttpRequest();
Get用法:
XHR.open('GET', url?key=value, false);
XHR.send() ;
Post用法:
XHR.open('POST', url, false);
XHR.send(FormData) ;

傳入參數時:
GET 方式
var postContent ="name=" + encodeURIComponent("xiaocheng") + "&email=" + encodeURIComponent("xiaochengf_21@yahoo.com.cn");
xmlhttp.open("GET", "somepage" + "?" + postContent, true);
xmlhttp.send(null);


POST 方式

var postContent ="name=" + encodeURIComponent("xiaocheng") + "&email=" + encodeURIComponent("xiaochengf_21@yahoo.com.cn");
xmlhttp.open("POST", "somepage", true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//xmlhttp.setRequestHeader("Content-Type", "text/xml"); //如果发送的是一个xml文件
xmlhttp.send(postContent);

註:
1.在ASP.NET AJAX裡,所有WebMethod只接受HTTP POST verb,更進一步還要求檢核Content-Type: application/json標頭,做到雙重保險。
2.可使用Request.HttpMethod == "POST"的檢查限阻止GET請求

參考資料:
http://www.dotblogs.com.tw/marcus116/archive/2011/05/29/26428.aspx
http://blog.toright.com/archives/1203
W3C Http Code 表示意義
http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Http Method 各類定義
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_methods
http://www.yongfa365.com/Item/Ajax-GET-POST.html
http://blog.darkthread.net/blogs/darkthreadtw/archive/2009/04/16/dont-use-get-ajax.aspx