[size=medium]一、表面區別
我們知道表單form的提交方式有post和get兩種方式,但是這兩種方式有什麼區別呢,知其然也要知其所以然。
在操作的時候,我們可以看到一些明顯的區別,從操作表面上來看get把引數新增到action屬性指定的位址中,並以錨方式開啟。在form提交中,可以通過method指定提交方式為get或者post,預設為get提交。
form表單不指定method,則預設為get請求,form中提交的資料將會附加在url之後,以「?」與url分開,字母數字原樣傳送,空給轉換為+號其他符號轉換為%xx,其中xx為該符號以16進製表示的ascii值,get請求提交的資料放置在請求http請求協議頭中,而post提交的資料則放在屍體資料中get資料最懂只能有1024位元組;post表示可能改變的伺服器上的資源的請求,post提交的資料則放在實體資料中,get資料最懂只能有1024位元組,而post資料沒有次限制,這就是為什麼大檔案的上傳多以post的方式。
二、實際應用的區別
我們再來看一下他們實際應用中的區別,為了理解兩者在傳輸過程中的不同,我們先看一下http協議的格式:
http請求:
]在http請求中,第一行必須是乙個請求行(request line),用來說明請求型別、要訪問的資源以及使用的http版本。緊接著是乙個首部(header)小節,用來說明伺服器要使用的附加資訊。在首部之後是乙個空行,再此之後可以新增任意的其他資料[稱之為主體(body)]。
get與post方法例項:
有了以上對http請求的了解和示例,我們再來看兩種提交方式的區別:
(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包的包體中。上文示例中紅色字型標明的就是實際的傳輸資料
因此,get提交的資料會在位址列中顯示出來,而post提交,位址列不會改變
(2)傳輸資料的大小:首先宣告:http協議沒有對傳輸的資料大小進行限制,http協議規範也沒有對url長度進行限制。
而在實際開發中存在的限制主要有:
get:特定瀏覽器和伺服器對url長度有限制,例如ie對url長度的限制是2083位元組(2k+35)。對於其他瀏覽器,如netscape、firefox等,理論上沒有長度限制,其限制取決於作業系統的支援。
因此對於get提交時,傳輸資料就會受到url長度的限制。
post:由於不是通過url傳值,理論上資料不受限。但實際各個web伺服器會規定對post提交資料大小進行限制,apache、iis6都有各自的配置。
(3)安全性:
post的安全性要比get的安全性高。注意:這裡所說的安全性和上面get提到的「安全」不是同個概念。上面「安全」的含義僅僅是不作資料修改,而這 裡安全的含義是真正的security的含義,比如:通過get提交資料,使用者名稱和密碼將明文出現在url上,因為(1)登入頁面有可能被瀏覽器快取, (2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用get提交資料還可能會造成cross-site request forgery攻擊
(4)http get,post,soap協議都是在http上執行的
1)get:請求引數是作為乙個key/value對的序列(查詢字串)附加到url上的
查詢字串的長度受到web瀏覽器和web伺服器的限制(如ie最多支援2048個字元),不適合傳輸大型資料集同時,它很不安全
但是:它不支援複雜資料型別,因為post沒有定義傳輸資料結構的語義和規則。
3)soap:是http post的乙個專用版本,遵循一種特殊的xml訊息格式
content-type設定為: text/xml 任何資料都可以xml化
http響應格式:
在響應中唯一真正的區別在於第一行中用狀態資訊代替了請求資訊。狀態行(status line)通過提供乙個狀態碼來說明所請求的資源情況。
http響應例項:
三、本質區別
一般在瀏覽器中輸入**訪問資源都是通過get方式; http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是get,post,put,delete。url全稱是資源描述符,我們可以這樣認為:乙個url位址,它用於描述乙個網路上的資源,而http中的get,post,put,delete就對應著對這個資源的查 、改 、增 、刪 4個操作。到這裡,get一般用於獲取/查詢 資源資訊,而post一般用於更新資源資訊,據說這是get和post的本質區別,也是協議設計者的本意,其它區別都是具體表現形式的差異。
1)根據http規範,get用於資訊獲取,而且應該是安全的(safe)和冪等的(idempotent)。
所謂安全的意味著該操作用於獲取資訊而非修改資訊。換句話說,get請求一般不應產生***。就是說,它僅僅是獲取資源資訊,就像資料庫查詢一樣,不會修改,增加資料,不會影響資源的狀態。這裡安全的含義僅僅是指是非修改資訊。
冪等的意味著對同一url的多個請求應該返回同樣的結果(冪等是數學或者計算機學的概念)。
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方法。
[url]原文參考:
get和post有什麼區別
get 和 post 只是 http 協議中兩種請求方式 異曲同工 而 http 協議是基於 tcp ip 的應用層協議,無論 get 還是 post,用的都是同乙個傳輸層協議,所以在傳輸上,沒有區別。有人說post 比 get 安全,因為資料在位址列上不可見。然而,從傳輸的角度來說,他們都是不安全...
GET和POST有什麼區別?
前幾天有人問我這個問題。我說get是用於獲取資料的,post,一般用於將資料發給伺服器之用。這個答案好像並不是他想要的。於是他繼續追問有沒有別的區別?我說這就是個名字而已,如果伺服器支援,他完全可以把get改個名字叫get2。他反問道,那就是單純的名字上的區別嘍?我想了想,我覺得如果說再具體的區別,...
GET和POST到底有什麼區別?
get和post是我們web開發時最常用到的兩種http請求方法,其實http最初定義了八種方法,而這八種方法在本質上沒有任何區別。它們底層的實現也都是基於tcp ip協議,之所以定義了這麼多,只是讓http請求更加的語義化而已。如果說到區別,那也僅僅是資料傳輸形式上的差異,我們先來看一下這八種方法...