1. 程式人生 > >淺談 POST 和 GET 在 Web中的應用

淺談 POST 和 GET 在 Web中的應用

  Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的4個操作。到這裡,大家應該有個大概的瞭解了,GET一般用於獲取/查詢資源資訊,而POST一般用於更新資源資訊。

  1.根據HTTP規範,GET用於資訊獲取,而且應該是安全的和冪等的

  (1).所謂安全的意味著該操作用於獲取資訊而非修改資訊。換句話說,GET 請求一般不應產生副作用。就是說,它僅僅是獲取資源資訊,就像資料庫查詢一樣,不會修改,增加資料,不會影響資源的狀態。

  * 注意:這裡安全的含義僅僅是指是非修改資訊。

  (2).冪等的意味著對同一URL的多個請求應該返回同樣的結果。這裡我再解釋一下冪等這個概念:

  冪等(idempotent、idempotence)是一個數學或計算機學概念,常見於抽象代數中。
  冪等有一下幾種定義:
  對於單目運算,如果一個運算對於在範圍內的所有的一個數多次進行該運算所得的結果和進行一次該運算所得的結果是一樣的,那麼我們就稱該運算是冪等的。比如絕對值運算就是一個例子,在實數集中,有abs(a)
=abs(abs(a))
  對於雙目運算,則要求當參與運算的兩個值是等值的情況下,如果滿足運算結果與參與運算的兩個值相等,則稱該運算冪等,如求兩個數的最大值的函式,有在在實數集中冪等,即max(x,x) 
= x

看完上述解釋後,應該可以理解GET冪等的含義了。

  但在實際應用中,以上2條規定並沒有這麼嚴格。引用別人文章的例子:比如,新聞站點的頭版不斷更新。雖然第二次請求會返回不同的一批新聞,該操作仍然被認為是安全的和冪等的,因為它總是返回當前的新聞。從根本上說,如果目標是當用戶開啟一個連結時,他可以確信從自身的角度來看沒有改變資源即可。

  2.根據HTTP規範,POST表示可能修改變伺服器上的資源的請求。繼續引用上面的例子:還是新聞以網站為例,讀者對新聞發表自己的評論應該通過POST實現,因為在評論提交後站點的資源已經不同了,或者說資源被修改了。

  上面大概說了一下HTTP規範中GET和POST的一些原理性的問題。但在實際的做的時候,很多人卻沒有按照HTTP規範去做,導致這個問題的原因有很多,比如說:

  1.很多人貪方便,更新資源時用了GET,因為用POST必須要到FORM(表單),這樣會麻煩一點。

  2.對資源的增,刪,改,查操作,其實都可以通過GET/POST完成,不需要用到PUT和DELETE。

  3.另外一個是,早期的Web MVC框架設計者們並沒有有意識地將URL當作抽象的資源來看待和設計,所以導致一個比較嚴重的問題是傳統的Web MVC框架基本上都只支援GET和POST兩種HTTP方法,而不支援PUT和DELETE方法。

   * 簡單解釋一下MVC:MVC本來是存在於Desktop程式中的,M是指資料模型,V是指使用者介面,C則是控制器。使用MVC的目的是將M和V的實現程式碼分離,從而使同一個程式可以使用不同的表現形式。

  以上3點典型地描述了老一套的風格(沒有嚴格遵守HTTP規範),隨著架構的發展,現在出現REST(Representational State Transfer),一套支援HTTP規範的新風格,這裡不多說了,可以參考《RESTful Web Services》。

  說完原理性的問題,我們再從表面現像上面看看GET和POST的區別

  1.GET請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳輸資料,引數之間以&相連,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果資料是英文字母/數字,原樣傳送,如果是空格,轉換為+,如果是中文/其他字元,則直接把字串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX為該符號以16進製表示的ASCII。

  POST把提交的資料則放置在是HTTP包的包體中。

  2."GET方式提交的資料最多隻能是1024位元組,理論上POST沒有限制,可傳較大量的資料,IIS4中最大為80KB,IIS5中為100KB"??!

  以上這句是我從其他文章轉過來的,其實這樣說是錯誤的,不準確的:

  (1).首先是"GET方式提交的資料最多隻能是1024位元組",因為GET是通過URL提交資料,那麼GET可提交的資料量就跟URL的長度有直接關係了。而實際上,URL不存在引數上限的問題HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。IE對URL長度的限制是2083位元組(2K+35)。對於其他瀏覽器,如Netscape、FireFox等,理論上沒有長度限制,其限制取決於作業系統的支援。

  注意這是限制是整個URL長度,而不僅僅是你的引數值資料長度。[見參考資料5]

  (2).理論上講,POST是沒有大小限制的HTTP協議規範也沒有進行大小限制,說“POST資料量存在80K/100K的大小限制”是不準確的,POST資料是沒有限制的,起限制作用的是伺服器的處理程式的處理能力。

  對於ASP程式,Request物件處理每個表單域時存在100K的資料長度限制。但如果使用Request.BinaryRead則沒有這個限制。

  由這個延伸出去,對於IIS 6.0,微軟出於安全考慮,加大了限制。我們還需要注意:

     1).IIS 6.0預設ASP POST資料量最大為200KB,每個表單域限制是100KB。
     2).IIS 6.0預設上傳檔案的最大大小是4MB。
     3).IIS 6.0預設最大請求頭是16KB。
  IIS 6.0之前沒有這些限制。[見參考資料5]

  所以上面的80K,100K可能只是預設值而已(注:關於IIS4和IIS5的引數,我還沒有確認),但肯定是可以自己設定的。由於每個版本的IIS對這些引數的預設值都不一樣,具體請參考相關的IIS配置文件。

  3.在ASP中,服務端獲取GET請求引數用Request.QueryString,獲取POST請求引數用Request.Form。在JSP中,用request.getParameter(\"XXXX\")來獲取,雖然jsp中也有request.getQueryString()方法,但使用起來比較麻煩,比如:傳一個test.jsp?name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分別獲取GET和POST中的資料,而$_REQUEST則可以獲取GET和POST兩種請求中的資料。值得注意的是,JSP中使用request和PHP中使用$_REQUEST都會有隱患,這個下次再寫個文章總結。

  4.POST的安全性要比GET的安全性高。注意:這裡所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的Security的含義,比如:通過GET提交資料,使用者名稱和密碼將明文出現在URL上,因為(1)登入頁面有可能被瀏覽器快取,(2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交資料還可能會造成Cross-site request forgery攻擊。

  總結一下,Get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種請求,在FORM(表單)中,Method預設為"GET",實質上,GET和POST只是傳送機制不同,並不是一個取一個發!

  純屬hyddd個人總結,如有錯漏請指出。:>

參考資料

[1].http://hi.baidu.com/liuzd003/blog/item/7bfecbfa6ea94ed8b58f318c.html

[2].http://www.blogjava.net/onlykeke/archive/2006/08/23/65285.aspx

[3].http://baike.baidu.com/view/2067025.htm

[4].http://www.chxwei.com/article.asp?id=373

[5].http://blog.csdn.net/somat/archive/2004/10/29/158707.aspx

轉載請說明出處,謝謝[hyddd(http://www.cnblogs.com/hyddd/)]

相關推薦

POST GETWeb應用

  Http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE。URL全稱是資源描述符,我們可以這樣認為:一個URL地址,它用於描述一個網路上的資源,而HTTP中的GET,POST,PUT,DELETE就對應著對這個資源的查,改,

由JDBCJNDI及其在WebSphere的配置企業級應用DB Session在Spring下的管理

在J2EE規範中對JDBC和JNDI進行了充分說明。本文展現了兩者間的一點聯絡,概要陳述下在WebSphere中如何配置JNDI資料來源以及在應用中使用JNDI資料來源,同時結合Spring簡述應用中D

AJAX - Http post get 的區別

安全 ext tex 不同方法 per 信息 行修改 進行 TE HTTP: post 和 get 是 HTTP 協議中的兩種方法。瀏覽器和服務器的交互是通過 HTTP 協議執行的,他的全稱為Hyper Text Transfer Protocol(超文本傳輸協議)。HTT

HTTPpostget傳參的區別

 插一下別的知識:HTTP的請求方式 HTTP一共有8中請求方式:1.OPTIONS    2.HEAD    3.GET    4.POST    5.PUT    6.DELETE  

AndroidHTTP PostGet請求

簡單的隨手記,適合初學者使用,現在網路請求比較流行使用OKHttp,後期部落格會寫到如何使用。 在AndroidManifest加入以下許可權 <uses-permission android:name="android.permission.INTERNET" />

PHP專案使用Guzzle執行POSTGET請求

以往在專案中要用到第三方介面時會用到封裝好的curl執行請求,現在有了更好的解決方案——Guzzle。 下面是官方介紹: Guzzle是一個PHP的HTTP客戶端,用來輕而易舉地傳送請求,並整合到我們的WEB服務上。 介面簡單:構建查詢語句、POST請求、分流

PythonVC的編碼問題(轉)

以前編碼問題總能讓自己湊或蒙過去,最近要做一個專案伺服器端用python寫,客戶端用c++,工程編譯的字符集使用UNICODE。之間通過socket進行通訊,通訊過程中編碼轉換問題把我搞得暈頭轉向,逼著我將編碼問題好好研究一番。 首先先談談VC中的編碼問題,首先編碼我們大致

Jmeterpostget請求的區別(五)

POST和GET的區別 1、原理不同: 一般我們在瀏覽器輸入一個網址訪問網站都是GET請求;post請求引數放在body data中。get多少次都不會改變頁面呈現的資料,post會。 2、資料量 GET傳送的資料量較小,不能大於2KB。POST傳送的資料量較大,一般預設為不受

ApacheHttpClientpostget的請求

ApachehttpClient是谷歌官方的http請求,Eclipse自帶有,但是AS好像沒有(還是我的AS版本問題)。它比httpURLConnection請求更簡單。 post請求相對get就是引數有變化 public class MainActi

springmvcPostget亂碼的解決

第一種方法依賴於tomcate6中webapps\examples\WEB-INF\classes\filters下SetCharacterEncodingFilter這個類 實現方法在web.xml 中新增以下程式碼 <filter>   <filter

CGI程式POSTGET訊息的處理

 資料傳送格式 當用戶填完表格並按了SUBMIT按鈕後,Web瀏覽器並非將使用者所填的資料直接送給Web伺服器, 而先要經過一定的編碼處理。 Web瀏覽器總是將資料按照“變數名=變數值”這樣的資料對格式進行編碼,並且每對資料之間 用一個&符號相連線。其中“變數名”

Androidpostget的提交方式【三種】

向伺服器提交資料有兩種方式,post和get。兩者的區別主要有三點,安全性、長度限制、資料結構。其中get請求安全性相比較而言較差,資料長度受瀏覽器位址列限制,沒有方法體。兩種都是較為重要的資料提交方式。現簡單介紹一下三種post和get的提交方式。無論是哪種方法實現post和get,get 的訪問路徑都

淺析HTTPPOSTGET區別並用Python模擬其響應請求

    最近在幾周在做手遊崩潰資訊收集和上傳,拿到崩潰資訊後,使用的是HTTP的POST方法上傳到公司共用的伺服器的,因此做簡單總結。本文首先簡單介紹了HTTP協議,主要說明了POST方法和GET方法的區別;然後用Python實現了 對POST方法和GET方法的響應;最後用

httppostget的區別

GET和POST是HTTP協議中的兩種傳送請求的方法。HTTP是基於TCP/IP的關於資料如何在全球資訊網中如何通訊的協議。所以GET和POST的底層都是TCP/IP,也就是說,GET/POST都是TC

php通過postget傳遞陣列的方法

1.php中通過post方式傳遞陣列 將input中的name屬性寫為xx[]形式。 eg <form action="" > <input type="text" name="myname[]"> <input type="text" na

android 螢幕適配 dpsp的區別

歡迎轉載 轉載註明出處 關於dp和sp的具體區別 看網上文章少有深入涉及 介於一次面試被問到:sp和dp的關係是什麼?例如一個控制元件寬度為 15dp 或者 15sp 在大部分情況下是一樣的,那什麼情況下不同? 找了半天木有這類文章,最後蒐集各種資源,在這

mmap()ioremap()的用法與區別

12只 設備 gpa 我們 之間 mmap ioremap shared set 一、mmap()mmap()函數是用來將設備內存線性地址映射到用戶地址空間。(1)首先映射基地址,再通過偏移地址尋址;(2)unsigned char *map_cru_base=(unsig

HTML提交方式postget區別(實驗)

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

【http】postget請求的區別

方式 無限制 信息 資源 敏感信息 字符 瀏覽器歷史記錄 指定 較差 兩種常用的HTTP請求方式:post和get get:從指定的資源進行請求。數據長度有限制(2048個字符)可被緩存、可被保留在瀏覽器歷史記錄中,安全性較差。發送敏感信息如密碼時不適用。 post

JSP 處理 POSTGET請求

例如 enc utf get post character 頁面 odi .get JSP頁面接受post請求,如果請求的參數值裏包含非西歐字符,首先需要調用 request.setCharacterEncoding("UTF-8"); 如果是GET請求,不能這樣做,可先獲