【網絡】get與post的區別 - w3c用法區別/從HTTP來看實質的區別

w3c對於區別作出的定義:(用法上)

(1)對參數的數據類型,GET只接受ASCII字符,而POST沒有限制,容許二進制。
(2)GET在瀏覽器回退/刷新時是無害的,而POST會再次提交請求。
(3)GET請求只能進行url編碼(application/x-www-form-urlencoded),而POST支持多種編碼方式(application/x-www-form-urlencoded 或 multipart/form-data),能夠爲二進制使用多重編碼 - HTML標準對HTTP協議的用法的約定,是瀏覽器攔截不讓發
(4)POST 比 GET 更安全,由於GET參數直接暴露在URL上,POST參數在HTTP消息主體中,並且不會被保存在瀏覽器歷史或 web 服務器日誌中。- GET提交數據還可能會形成Cross-site request forgery攻擊+對於用戶名等敏感信息暴露
(5)對參數數據長度的限制,GET方法URL的長度是受限制的,最大是2048個字符,POST參數數據是沒有限制的。- 瀏覽器/服務器行爲,http沒有作出限制:惡意僞造大額content-length讓服務器響應時間變長
(6)GET請求會被瀏覽器主動緩存,POST不會,除非手動設置。
(7)GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
(8)GET請求可被收藏爲書籤,POST不能。web

常見答案:

1. GET使用URL或Cookie傳參,而POST將數據放在BODY中。
2. GET方式提交的數據有長度限制,則POST的數據則能夠很是大。
3. POST比GET安全,由於數據在地址欄上不可見。瀏覽器

在HTTP上看

闢謠:

  • HTTP規範定義:GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息。
    方法都只是規定:使用哪一個Method與應用層的數據如何傳輸是沒有相互關係的,get同樣能夠發送body
  • HTTP協議對GET和POST都沒有對長度的限制

本質區別

GET冪等,POST不冪等

http的method的定義,只是對行爲的定義,冪等(有無反作用)的定義,沒有強制定義,對其約束很低,爲了服務器/瀏覽器的壓力和安全,纔對http的method作出了一些限制,且對於不用瀏覽器和服務器這些限制是不一樣,其二者本質都是基於TCP傳輸,區別只是冪等緩存

冪等

定義:是指同一個請求方法執行屢次和僅執行一次的效果徹底相同。
 1.按照RFC規範,PUT,DELETE和安全方法都是冪等的。雖然說是規範,但服務端實現是否冪等是沒法確保的。
 2.引入冪等主要是爲了處理同一個請求重複發送的狀況,好比在請求響應前失去鏈接,若是方法是冪等的,就能夠放心地重發一次請求。這也是瀏覽器在後退/刷新時遇到POST會給用戶提示的緣由:POST語義不是冪等的,重複請求可能會帶來意想不到的後果。
 3.好比在微博這個場景裏,GET的語義會被用在「看看個人Timeline上最新的20條微博」這樣的場景,而POST的語義會被用在「發微博、評論、點贊」這樣的場景中。

總結:

  • GET的語義是請求獲取指定的資源。GET方法是安全、冪等、可緩存的(除非有 Cache-Control Header的約束),GET方法的報文主體沒有任何語義。
  • POST的語義是根據請求負荷(報文主體)對指定的資源作出處理,具體的處理方式視資源類型而不一樣。POST不安全,不冪等,(大部分實現)不可緩存。

參考:
https://www.jianshu.com/p/8fd...安全

相關文章
相關標籤/搜索