get和post是什麼?http協議中的兩種傳送請求的方法。
http是什麼?http是基於tcp/ip的關於資料如何在全球資訊網中如何通訊的協議。
其實,get和post本質上兩者沒有任何區別。他們都是http協議中的請求方法。底層實現都是基於tcp/ip協議。上述的所謂區別,只是瀏覽器廠家根據約定,做得限制而已。
http請求,最初設定了八種方法。這八種方法本質上沒有任何區別。只是讓請求,更加有語義而已。
options 返回伺服器所支援的請求方法
get 向伺服器獲取指定資源
head 與get一致,只不過響應體不返回,只返回響應頭
post 向伺服器提交資料,資料放在請求體裡
put 與post相似,只是具有冪等特性,一般用於更新
delete 刪除伺服器指定資源
trace 回顯伺服器端收到的請求,測試的時候會用到這個
connect 預留,暫無使用
tcp就像汽車,我們用tcp來運輸資料,它很可靠,從來不會發生丟件少件的現象。但是如果路上跑的全是看起來一模一樣的汽車,那這個世界看起來是一團混亂,送急件的汽車可能被前面滿載貨物的汽車攔堵在路上,整個交通系統一定會癱瘓。為了避免這種情況發生,交通規則http誕生了。http給汽車運輸設定了好幾個服務類別,有get, post, put, delete等等,http規定,當執行get請求的時候,要給汽車貼上get的標籤(設定method為get),而且要求把傳送的資料放在車頂上(url中)以方便記錄。如果是post請求,就要在車上貼上post的標籤,並把貨物放在車廂裡。當然,你也可以在get的時候往車廂內偷偷藏點貨物,但是這是很不光彩;也可以在post的時候在車頂上也放一些資料,讓人覺得傻乎乎的。http只是個行為準則,而tcp才是get和post怎麼實現的基本。
網路上都會提到瀏覽器位址列輸入的引數是有限的。
首先說明一點,http 協議沒有 body 和 url 的長度限制,對 url 限制的大多是瀏覽器和伺服器的原因。
瀏覽器原因就不說了,伺服器是因為處理長 url 要消耗比較多的資源,為了效能和安全(防止惡意構造長 url 來攻擊)考慮,會給 url 長度加限制。
還有另乙個重要的角色:運輸公司。不同的瀏覽器(發起http請求)和伺服器(接受http請求)就是不同的運輸公司。 雖然理論上,你可以在車頂上無限的堆貨物(url中無限加引數)。但是運輸公司可不傻,裝貨和卸貨也是有很大成本的,他們會限制單次運輸量來控制風險,資料量太大對瀏覽器和伺服器都是很大負擔。業界不成文的規定是,(大多數)瀏覽器通常都會限制url長度在2k個位元組,而(大多數)伺服器最多處理64k大小的url。超過的部分,恕不處理。如果你用get服務,在request body偷偷藏了資料,不同伺服器的處理方式也是不同的,有些伺服器會幫你卸貨,讀出資料,有些伺服器直接忽略,所以,雖然get可以帶request body,也不能保證一定能被接收到哦。
好了,現在你知道,get和post本質上就是tcp鏈結,並無差別。但是由於http的規定和瀏覽器/伺服器的限制,導致他們在應用過程中體現出一些不同。
有些文章中提到,post 會將 header 和 body 分開傳送,先傳送 header,服務端返回 100 狀態碼再傳送 body。
http 協議中沒有明確說明 post 會產生兩個 tcp 資料報,而且實際測試(chrome)發現,header 和 body 不會分開傳送。
所以,header 和 body 分開傳送是部分瀏覽器或框架的請求方法,不屬於 post 必然行為。
get和post還有乙個重大區別,簡單的說:
get產生乙個tcp資料報;post產生兩個tcp資料報。
長的說:
對於get方式的請求,瀏覽器會把http header和data一併傳送出去,伺服器響應200(返回資料);
而對於post,瀏覽器先傳送header,伺服器響應100 continue,瀏覽器再傳送data,伺服器響應200 ok(返回資料)。
也就是說,get只需要汽車跑一趟就把貨送到了,而post得跑兩趟,第一趟,先去和伺服器打個招呼「嗨,我等下要送一批貨來,你們開啟門迎接我」,然後再回頭把貨送過去。
1. get與post都有自己的語義,不能隨便混用。
2. 據研究,在網路環境好的情況下,發一次包的時間和發兩次包的時間差別基本可以無視。而在網路環境差的情況下,兩次包的tcp在驗證資料報完整性上,有非常大的優點。
3. 並不是所有瀏覽器都會在post中傳送兩次包,firefox就只傳送一次。
有人說post 比 get 安全,因為資料在位址列上不可見。
然而,從傳輸的角度來說,他們都是不安全的,因為 http 在網路上是明文傳輸的,只要在網路節點上捉包,就能完整地獲取資料報文。
要想安全傳輸,就只有加密,也就是 https。
get和post的區別主要有以下幾方面:
1、url可見性:
get,引數url可見;
post,url引數不可見
2、資料傳輸上:
get,通過拼接url進行傳遞引數;
post,通過body體傳輸引數
3、快取性:
get請求是可以快取的
post請求不可以快取
4、後退頁面的反應
get請求頁面後退時,不產生影響
post請求頁面後退時,會重新提交請求
5、傳輸資料的大小
get一般傳輸資料大小不超過2k-4k(根據瀏覽器不同,限制不一樣,但相差不大)
post請求傳輸資料的大小根據php.ini 配置檔案設定,也可以無限大。
6、安全性
這個也是最不好分析的,原則上post肯定要比get安全,畢竟傳輸引數時url不可見,但也擋不住部分人閒的沒事在那抓包玩。安全性個人覺得是沒多大區別的,防君子不防小人就是這個道理。對傳遞的引數進行加密,其實都一樣。
傳值get post區別
一原理區別 一般在瀏覽器中輸入 訪問資源都是通過get方式 在form提交中,可以通過method指定提交方式為get或者post,預設為get提交 http定義了與伺服器互動的不同方法,最基本的方法有4種,分別是get,post,put,delete url全稱是資源描述符,我們可以這樣認為 乙個...
PHP外部標量 GET POST傳值區別
php得外部變數是php在使用過程中規定好的一些變數,這個變數是已經規定好用法的。下面是幾個最常用的例子,我們將下面的表單命名為user.html 上面是很基礎的一段html 在這段 的主要功能是把使用者名稱和密碼,採用get方法,將資料傳送給reg.php 在上面 的第6行有標記 reg.php想...
IOS 傳值 總結
1 屬性傳值 前向後傳值。2 協議傳值 3 block傳值 代替協議 傳值,主要時間點問題。4 單利傳值 資料共享。5 通知傳值 通知中心 nsnotificationcenter提供了一種更加解耦的方式。最典型的應用就是任何物件對可以傳送通知到中心,同時任何物件可以監聽中心的通知。傳送通知的 如下...