淺談http get和post請求

從標準上看,基本區別有:

  • get 用於獲取信息,無反作用,冪等,且可緩存。
  • post 用於修改服務器上的數據,有反作用,非冪等,不可緩存。

w3school

(冪等:在編程中一個冪等操做的特色是其任意屢次執行所產生的影響均與一次執行的影響相同。)php

GET和POST報文上的區別:

結論先行:GET 和POST 方法沒有本質區別,僅報文格式不一樣。html

GET和POST只是HTTP協議中的兩種請求方式,而HTTP協議是基於TCP/IP的應用層協議,不管GET仍是POST,用的都是同一個傳輸層協議,因此在傳輸上,沒有區別。編程

報文格式上:瀏覽器

  • 不帶參數時,僅第一行方法名不一樣,一個是GET,一個是POST。
  • 帶參數時,在約定中,GET方法的參數應該放在url中,POST方法的參數應該放在body中。
//easy demo
GET /index.php?name=qiming.c&age=22 HTTP/1.1
Host: localhost

POST /index.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
name=qiming.c&age=22
複製代碼

兩種方法本質上是TCP鏈接,沒有差異。也就是說,不按規範來也能夠,能夠在URL上寫參數,而後用POST,也能夠在body上寫參數,而後方法用GET,固然,這須要服務端的支持。緩存

常見疑惑

GET 方法參數寫法是固定的嗎?

在約定中,通常咱們的參數是寫在 ? 後面,用 & 分割。安全

咱們知道,解析報文的過程是經過獲取 TCP 數據,用正則等工具從數據中獲取 Header 和 Body,從而提取參數。bash

也就是說,咱們能夠本身約定參數的寫法,只要服務端可以解釋出來就行,一種比較流行的寫法是這樣 :服務器

http://www.example.com/user/name/yourname/age/22
複製代碼

POST 方法比 GET 方法安全?

從傳輸的角度來講,他們都是不安全的,由於 HTTP 在網絡上是明文傳輸,只要在網絡節點上抓包,就能完整地獲取數據報文。網絡

要想安全傳輸,就只有加密,也就是 HTTPS。app

GET 方法參數長度有限制?

其實HTTP協議自己並無對URL和BODY的長度限制,對URL限制的大可能是瀏覽器和服務端本身限制的。

瀏覽器緣由就不說了,服務器是由於處理長 URL 要消耗比較多的資源,爲了性能和安全(防止惡意構造長 URL 來攻擊)考慮,會給 URL 長度加限制。

POST 方法會產生兩個TCP數據包?

有些文章中提到,POST 請求會將 Header 和 Body 分開發送,先發送 Header,服務端返回 100 狀態碼再發送 Body。

HTTP 協議中也並無明確說明 POST 會產生兩個 TCP 數據包,並且實際測試(Chrome)發現,Header 和 Body 不會分開發送。

因此,Header 和 Body 分開發送是部分瀏覽器或框架的請求方法,不屬於 Post的必然行爲。

參考文章

相關文章
相關標籤/搜索