一、原理區別
一般我們在瀏覽器輸入一個網址訪問網站都是GET請求;再FORM表單中,可以通過設定Method指定提交方式為GET或者POST提交方式,預設為GET提交方式。
HTTP定義了與伺服器互動的不同方法,其中最基本的四種:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被稱為安全方法,因為使用GET和HEAD的HTTP請求不會產生什麼動作。不會產生動作意味著GET和HEAD的HTTP請求不會在伺服器上產生任何結果。但是安全方法並不是什麼動作都不產生,這裡的安全方法僅僅指不會修改資訊。
根據HTTP規範,POST可能會修改伺服器上的資源的請求。比如知乎編寫文章,使用者提交一篇文章或者一個讀者提交評論是通過POST請求來實現的,因為再提交文章或者評論提交後資源(即某個頁面)不同了,或者說資源被修改了,這些便是“不安全方法”。
二、使用時最直觀的區別
最直觀的區別就是GET把引數包含在URL中,POST通過request body傳遞引數。
get請求:
post請求:
三、為什麼get比post更快
1.post請求包含更多的請求頭
因為post需要在請求的body部分包含資料,所以會多了幾個資料描述部分的首部欄位(如:content-type),這其實是微乎其微的。
2.最重要的一條,post在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料
post請求的過程:
(1)瀏覽器請求tcp連線(第一次握手)
(2)伺服器答應進行tcp連線(第二次握手)
(3)瀏覽器確認,併傳送post請求頭(第三次握手,這個報文比較小,所以http會在此時進行第一次資料傳送)
(4)伺服器返回100 Continue響應
(5)瀏覽器傳送資料
(6)伺服器返回200 OK響應
get請求的過程:
(1)瀏覽器請求tcp連線(第一次握手)
(2)伺服器答應進行tcp連線(第二次握手)
(3)瀏覽器確認,併傳送get請求頭和資料(第三次握手,這個報文比較小,所以http會在此時進行第一次資料傳送)
(4)伺服器返回200 OK響應
也就是說,目測get的總耗是post的2/3左右,這個口說無憑,網上已經有網友進行過測試。
3.get會將資料快取起來,而post不會
可以做個簡短的測試,使用ajax採用get方式請求靜態資料(比如html頁面,圖片)的時候,如果兩次傳輸的資料相同,第二次以後消耗的時間將會在10ms以內(chrome測試),而post每次消耗的時間都差不多。經測試,chrome和firefox下如果檢測到get請求的是靜態資源,則會快取,如果是資料,則不會快取,但是IE什麼都會快取起來,當然,應該沒有人用post去獲取靜態資料吧,反正我是沒見過。
四、面試是一般怎麼回答get和post的區別
(1)post更安全(不會作為url的一部分,不會被快取、儲存在伺服器日誌、以及瀏覽器瀏覽記錄中)
(2)post傳送的資料更大(get有url長度限制)
(3)post能傳送更多的資料型別(get只能傳送ASCII字元)
(4)post比get慢
(5)post用於修改和寫入資料,get一般用於搜尋排序和篩選之類的操作(淘寶,支付寶的搜尋查詢都是get提交),目的是資源的獲取,讀取資料
五、測試get和post請求的工具
get和post請求一般使用的是介面測試工具,介面測試工具我個人一般使用的是:apipost和jmeter。
apipost是一款國產的介面測試工具和介面文件生成工具,能夠滿足我們日常工作當中對於介面測試和介面文件生成的工作需求。介面文件還可以支援多種格式的生成,有線上版、markdown、word版等多種格式的介面文件。
jmeter可以進行介面測試和效能測試,但是對於做單純的介面測試jmeter操作起來沒有apipost使用起來方便。jmeter重點在於壓力測試,穩定性測試和負載測試。針對於介面和程式的穩定性設計的一塊以軟體效能為主介面測試為輔的介面測試工具。
工具下載地址:https://www.apipost.cn/
本作品採用《CC 協議》,轉載必須註明作者和本文連結