1. 程式人生 > 其它 >GET POST 區別!別聽他們扯犢子,越看越氣人

GET POST 區別!別聽他們扯犢子,越看越氣人

技術標籤:面試getpost

最近面試的幾個同學,問他們GET POST區別,居然給我來一套一套的。網上我就查了查,我草,越看越特麼氣人。一群人總是抄來抄去。

錯誤1:GET 安全性低 POST 安全性高

我日了,你F12看過嗎, GET 是URL中傳值,POST 是body傳值。body 中還給你完美格式化了呢。post 開啟控制面板看的更清楚,form data還給你排版了呢。

通過GET提交的資料會被瀏覽器快取起來,其他人看歷史記錄的時候可以看到你提交的具體內容。post不會。

GET 提交資料可能會造成CSRF攻擊,所以才說它是不安全的。因為 HTTP 在網路上是明文傳輸的,只要在網路節點上捉包,就能完整地獲取資料報文,要想安全傳輸,就只有加密,也就是 HTTPS。

錯誤2:GET 傳輸資料有限制不能大於2KB POST 一般不限制

我特奶奶的,哪裡明文規定這個了?人家只是說了沒有限制

看這裡:https://www.ietf.org/rfc/rfc2616.txt

The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).

HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和伺服器的原因。瀏覽器原因就不說了,伺服器是因為處理長 URL 要消耗比較多的資源,為了效能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制。

下面就是對各種瀏覽器和伺服器的最大處理能力做一些說明:

瀏覽器URL 限制字元
IE2083個位元組
Firefox65536個位元組
Safari80000個位元組
Opera190000個位元組
Google8182個位元組
360極速瀏覽器2118位元組
Apache8,192個位元組
IIS16,384個位元組

錯誤3:get是獲取資料的,而post是提交資料的

get替換post來優化網站效能,雖然這種說法沒錯,也的確get常被用於取回資料,但是post也被一些ui框架使用於取回資料,比如kendo ui中的grid,就是用post來接受資料的。所以結論是get、post用途也是因地制宜。如果你有使用過kendo UI,會發現分頁、過濾、自定義的引數都包含在form data裡面。

只是它們的語義不同而已,各有各的,就好比湯勺就是喝湯用的,當然你用它炒菜也是可以的,只是有點彆扭,而且是不是有點二二的感覺,哈哈哈。

注:HTTP請求,最初設定了八種方法。這八種方法本質上沒有任何區別。只是讓請求,更加有語義而已。

請求描述
OPTIONS返回伺服器所支援的請求方法
GET向伺服器獲取指定資源
HEAD與GET一致,只不過響應體不返回,只返回響應頭
POST向伺服器提交資料,資料放在請求體裡
PUT與POST相似,只是具有冪等特性,一般用於更新
DELETE刪除伺服器指定資源
TRACE回顯伺服器端收到的請求,測試的時候會用到這個
CONNECT預留,暫無使用

GET 用於獲取資訊,是無副作用的,是冪等的,且可快取, 而POST 用於修改伺服器上的資料,有副作用,非冪等,不可快取。

當然,GET和POST本質上並沒有什麼區別,GET和POST是就是HTTP協議中的兩種傳送請求的方法。

HTTP是什麼?HTTP是基於TCP/IP的關於資料如何在全球資訊網中如何通訊的協議。是一種網路應用層協議,HTTP的底層是TCP/IP。所以GET和POST的底層也是TCP/IP,也就是說,GET/POST都是TCP連結。GET和POST能做的事情是一樣一樣的。你要給GET加上 request body,給POST帶上url 引數,技術上是完全行的通的。

錯誤4:GET產生一個TCP資料包;POST產生兩個TCP資料包。

實際上,不論哪一種瀏覽器,在傳送 POST 的時候都沒有帶 Expect 頭,server 也自然不會發 100 continue。通過抓包發現,儘管會分兩次,body 就是緊隨在 header 後面傳送的,根本不存在『等待伺服器響應』這一說。

get是querystring(僅支援urlencode編碼),post是放在body(支援多種編碼)

query是URL的一部分,而GET、POST等是請求方法的一種,怎麼混為一談了,不管是哪種請求方法,都必須有URL,而URL的query是可選的,可有可無。