GET 與 POST 其實沒有什么區別
本文寫于 2020 年 12 月 30 日
GET 與 POST 是兩種 HTTP 方法,并且是最常用的兩種,
今天在使用 Postman 測驗 api 的時候,突發奇想:在 Get 請求的請求體中寫 Body 引數,在 Post 請求中寫 Query 引數,
居然完全可以運行!
對比起我之前看過的一些文章,所謂的 GET 與 POST 的區別,可以說:網上大部分對二者的分析都是錯的,GET 和 POST 沒有本質的區別,
GET 的 HTTP 報文完全是這樣的:
GET /cats?id=1 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Content-Length: 15
{
"id": 1
}
GET 也可以是這樣的:
POST /cats?id=1 HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Content-Length: 15
{
"id": 1
}
發現除了開頭的方法不同,別的完全是一模一樣的!
如果我們想要知道他們之間的區別,首先我們得明確:什么是 HTTP?什么是 HTTP 方法?
什么是 HTTP
什么是 HTTP 呢?
HTTP 是一種協議,他的設計目的是保證客戶端與服務器之間的通信,
HTTP 的作業方式是客戶端與服務器之間的「請求」與「應答」,(這個客戶端可能是 web 瀏覽器,也可能是需要聯網的本地應用程式)
但是這個「請求」與「應答」不能瞎來啊,我們互相之間得看得懂才行——這就是協議的作用:規定好應該如何請求、應該如何回應,
關于 HTTP 不多做解釋,可以看之前一的一篇用簡單 Node.js 后臺程式看 HTTP 請求,
HTTP 方法
而 HTTP 方法呢,顧名思義,就是指在客戶端和服務器之間進行「請求-回應」時,被用到的方法,
GET 和 POST 各用一句話來描述:
- GET 從指定的資源請求資料
- POST 向指定的資源提交要被處理的資料
常見錯誤答案
常常會有人分析 GET 與 POST 的區別,這里說一下幾個廣為流傳的“錯誤答案”,甚至有些 W3C 也是這么寫的,
GET 的長度有限制,POST 沒有
GET 方法的長度限制是怎么回事?真的有限制嗎?
有限制的其實是 URL,如果你愿意把引數寫到 GET 請求的 Body 里去,那 GET 請求的長度和 POST 就是一樣的了,
并且即使是 URL 的長度限制,那也不是 HTTP 協議的鍋,HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大多是瀏覽器和服務器的原因,
瀏覽器原因就不說了,服務器是因為處理長 URL 要消耗比較多的資源,為了性能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制,
并且 POST 也不是沒有限制的,只是比較大而已,
- 通常 GET 請求中的 Query 引數大小是以 k 為單位記錄的,根據不同的瀏覽器和服務器有不同的資料;
- POST 請求的大小是以 M 為單位記錄的,同樣取決于服務器,
POST 方法比 GET 方法安全
按照網上大部分文章的解釋,POST 比 GET 安全,因為資料在地址欄上不可見,
然而,從傳輸的角度來說,他們都是不安全的!!!
因為 HTTP 在網路上是明文傳輸的,只要在網路節點上抓包,就能完整地獲取資料報文,
要想安全傳輸,就只有加密,也就是 HTTPS,
GET 的引數是固定寫法
我們必須把 GET 的引數寫在 ? 后面,用 & 分割嗎?
根本不用,
因為決議報文的程序是通過獲取 TCP 資料,用正則等工具從資料中獲取 Header 和 Body,從而提取引數,
也就是說,我們可以自己約定引數的寫法,只要服務端能夠解釋出來就行,一種比較流行的寫法是 http://www.example.com/user/name/chengqm/age/22,
參考文章:
W3C HTTP 方法:GET 對比 POST
99%的人都理解錯了 HTTP 中 GET 與 POST 的區別
都 2019 年了,還問 GET 和 POST 的區別
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/242771.html
標籤:其他
上一篇:蒲公英 · JELLY技術周刊 Vol.36: 你好 Hooks,再見 2020
下一篇:淺談vue原理(三)
