GET 與 POST 其實沒有什麼區別

GET 與 POST 其實沒有什麼區別

本文寫於 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 是一種協議,他的設計目的是保證客戶端與服務器之間的通訊。

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 的區別

(完)

相關文章
相關標籤/搜索