本文寫於 2020 年 12 月 30 日javascript
GET 與 POST 是兩種 HTTP 方法,而且是最經常使用的兩種。html
今天在使用 Postman 測試 api 的時候,突發奇想:在 Get 請求的請求體中寫 Body 參數,在 Post 請求中寫 Query 參數。java
竟然徹底能夠運行!web
對比起我以前看過的一些文章,所謂的 GET 與 POST 的區別,能夠說:網上大部分對兩者的分析都是錯的,GET 和 POST 沒有本質的區別。json
GET 的 HTTP 報文徹底是這樣的:api
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 的工做方式是客戶端與服務器之間的「請求」與「應答」。(這個客戶端多是 web 瀏覽器,也多是須要聯網的本地應用程序)
可是這個「請求」與「應答」不能瞎來啊,咱們互相之間得看得懂才行——這就是協議的做用:規定好應該如何請求、應該如何響應。
關於 HTTP 很少作解釋,能夠看以前一的一篇用簡單 Node.js 後臺程序看 HTTP 請求。
而 HTTP 方法呢,顧名思義,就是指在客戶端和服務器之間進行「請求-響應」時,被用到的方法。
GET 和 POST 各用一句話來描述:
經常會有人分析 GET 與 POST 的區別,這裏說一下幾個廣爲流傳的「錯誤答案」,甚至有些 W3C 也是這麼寫的。
GET 方法的長度限制是怎麼回事?真的有限制嗎?
有限制的實際上是 URL,若是你願意把參數寫到 GET 請求的 Body 裏去,那 GET 請求的長度和 POST 就是同樣的了。
而且即便是 URL 的長度限制,那也不是 HTTP 協議的鍋。HTTP 協議沒有 Body 和 URL 的長度限制,對 URL 限制的大可能是瀏覽器和服務器的緣由。
瀏覽器緣由就不說了,服務器是由於處理長 URL 要消耗比較多的資源,爲了性能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制。
而且 POST 也不是沒有限制的,只是比較大而已。
按照網上大部分文章的解釋,POST 比 GET 安全,由於數據在地址欄上不可見。
然而,從傳輸的角度來講,他們都是不安全的!!!
由於 HTTP 在網絡上是明文傳輸的,只要在網絡節點上抓包,就能完整地獲取數據報文。
要想安全傳輸,就只有加密,也就是 HTTPS。
咱們必須把 GET 的參數寫在 ? 後面,用 & 分割嗎?
根本不用。
由於解析報文的過程是經過獲取 TCP 數據,用正則等工具從數據中獲取 Header 和 Body,從而提取參數。
也就是說,咱們能夠本身約定參數的寫法,只要服務端可以解釋出來就行,一種比較流行的寫法是 http://www.example.com/user/name/chengqm/age/22。
參考文章:
99%的人都理解錯了 HTTP 中 GET 與 POST 的區別
(完)