GET 和 POST詳解
轉載:
知乎:https://www.zhihu.com/question/28586791
一、HTTP請求方法
Http協議定義了很多與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE.
一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操作。
我們最常見的就是GET和POST了。GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息.
1、GET - 最常見的一種請求方式
當客戶端要從服務器中讀取文檔時,當點擊網頁上的鏈接或者通過在瀏覽器的地址欄輸入網址來瀏覽網頁的,使用的都是GET方式。
GET方法要求服務器將URL定位的資源放在響應報文的數據部分,回送給客戶端。
使用GET方法時,請求參數和對應的值附加在URL后面,利用一個問號(“?”)代表URL的結尾與請求參數的開始,傳遞參數長度受限制。
例如,/index.jsp?id=100&op=bind,這樣通過GET方式傳遞的參數直接表示在地址中 以用google搜索domety為例,Request報文如下: GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */* Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r
可以看到,GET方式的請求一般不包含”請求內容”部分,請求數據以地址的形式表現在請求行。地址鏈接如下:
<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=</a>
地址中”?”之后的部分就是通過GET發送的請求數據,在地址欄中可以看到,各個數據之間用”&”符號隔開。很顯然,這種方式不適合傳送私密數據。
另外,由於不同的瀏覽器對地址的字符限制也有所不同,一般最多只能識別1024個字符,所以如果需要傳送大量數據的時候,也不適合使用GET方式。
2、POST
對於上面提到的不適合使用GET方式的情況,可以考慮使用POST方式,因為使用POST方法可以允許客戶端給服務器提供信息較多。POST方法將請求參數封裝在HTTP請求數據中,以名稱/值的形式出現,可以傳輸大量數據,這樣POST方式對傳送的數據大小沒有限制,而且也不會顯示在URL中。還以上面的搜索domety為例,如果使用POST方式的話,格式如下:
POST /search HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */* Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r hl=zh-CN&source=hp&q=domety
可以看到,POST方式請求行中不包含數據字符串,這些數據保存在”請求內容”部分,各數據之間也是使用”&”符號隔開。
POST方式大多用於頁面的表單中。因為POST也能完成GET的功能,因此多數人在設計表單的時候一律都使用POST方式,其實這是一個誤區。
GET方式也有自己的特點和優勢,我們應該根據不同的情況來選擇是使用GET還是使用POST。
3、HEAD
HEAD就像GET,只不過服務端接受到HEAD請求后只返回響應頭,而不會發送響應內容。當我們只需要查看某個頁面的狀態的時候,使用HEAD是非常高效的,因為在傳輸的過程中省去了頁面內容。
4、Get和Post方法的區別
我們看看GET和POST的區別
1. GET提交的數據會放在URL之后,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
2. GET提交的數據大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
3. GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
4. GET方式提交數據,會帶來安全問題,比如一個登錄頁面,通過GET方式提交數據時,用戶名和密碼將出現在URL上,如果頁面可以被緩存或者其他人可以訪問這台機器,就可以從歷史記錄獲得該用戶的賬號和密碼.
二、背景介紹
get 和 post是HTTP中請求數據的方法;application json 與form表單是HTTP中傳輸文件的類型,所以要了解其中的區別,要先了解HTTP 協議格式 和 HTTP Header
三、常見問題
get 與 post的區別?
1.GET請求的數據會附在URL之后,以?分割URL和傳輸數據,參數之間以&相連,POST把提交的數據則放置在是HTTP包的包體中。
2.GET的長度受限於url的長度,而url的長度限制是特定的瀏覽器和服務器設置的,理論上GET的長度可以無限長。
3.POST是沒有大小限制的,HTTP協議規范也沒有進行大小限制,起限制作用的是服務器的處理程序的處理能力
4.在ASP中,服務端獲取GET請求參數用Request.QueryString,獲取POST請求參數用Request.Form。
5.POST的安全性要比GET的安全性高
application json 與form表單的區別?
首先,Content-Type 被指定為 application/x-www-form-urlencoded,jQuery的Ajax請求默認方式,其次,數據以鍵值對形式?key1=value1&key2=value2的方式發送到服務器
post和get的選擇?
私密性的信息請求使用post。
查詢信息和可以想要通過url分享的信息使用get。