HTTP協議在現代網絡通訊中被普遍應用,在HTTP 1.0版本中有7種請求方式,在HTTP 1.1版本中有8種請求方式,而這些請求方式中最經常使用的就是GET和POST,網上關於GET與POST請求方式的區別的文章不少,但卻都不夠全面。如今咱們來全面闡述這兩種方法的區別。數據庫
(一)從HTTP報文來看瀏覽器
GET請求方式將請求信息放在URL後面,請求信息和URL之間以?隔開,請求信息的格式爲鍵值對,例如 https://baike.baidu.com/item/Python/407313?fr=aladdin,這種請求方式將請求信息直接暴露在URL中,安全性較低。另外從報文結構上來看,因爲請求信息放置在URL中,所以請求報文中不須要報文體。緩存
POST請求方式將請求信息放置在報文體中,相得到請求信息必須解析報文,所以安全性較GET方式要高一些(事實上要得到報文體中的請求信息也是很容易的,所以安全性上二者並無太多的區別,具體解決傳輸過程當中的安全性問題還要靠HTTPS),此外在請求報文中含有報文體。安全
因爲GET中的請求信息放置在URL中,所以是有長度限制的,由於URL自己是有長度限制的。POST中的請求信息是放置在報文體中,所以對數據長度是沒有限制的。服務器
(二)從數據庫層面來看網絡
CET請求方式符合冪等性和安全性,(冪等性的定義:對數據庫的一次操做和屢次操做得到的結果是一致的,則認爲符合冪等性。安全性的定義:對數據庫的操做沒有改變數據庫中的數據,則認爲符合安全性),GET請求方式是作查詢操做,所以不會改變數據庫中原有的數據,認爲符合安全性。事實上GET請求可能會出現屢次請求的結果(例如在兩次請求中間對數據庫中的數據做了更改),從這來講是不符合冪等性的定義,可是由於GET請求知識查詢數據庫,不會對數據庫作任何更改,所以也認爲是冪等的。spa
POST請求方式是既不冪等又不安全,首先POST請求方式往數據庫中提交數據的,所以會改變數據庫中的數據。其次,POST請求方式每次得到的結果都有可能不同,由於POST請求是做用在上一級的URL上的,則每一次請求都會添加一份新資源(這也是POST和PUT方式的最大區別,PUT方式是冪等的)。資源
注意:在這裏提到的安全性和上一部分提到的安全性不是同一律念,不要混淆。it
(三)從其餘層面來看請求
GET請求可以被緩存。
GET請求會保存在瀏覽器的瀏覽記錄中。
以GET請求的URL可以保存爲瀏覽器書籤。
而POST方式都不具有上述功能。緩存也是GET請求被普遍應用的根本,在現代網絡上天天產生的請求數目是巨大地,而且其中絕大部分請求均爲只讀請求,若是全部這些請求都要交由 Web 服務器直接處理,這無疑是巨大的資源浪費。從第二部分知道GET表達的是一種冪等的、安全的,它除了返回結果不該該會產生其它反作用,所以絕大部分GET請求(一般超過90%)都直接被CDN緩存了,這能大大減小 Web 服務器的負擔。 而POST是非冪等的,有反作用的操做,因此必須交由 Web 服務器處理。