http請求中g(shù)et和post方法的區(qū)別
一、原理區(qū)別
一般我們在瀏覽器輸入一個網(wǎng)址訪問網(wǎng)站都是GET請求;再FORM表單中,可以通過設(shè)置Method指定提交方式為GET或者POST提交方式,默認(rèn)為GET提交方式。
HTTP定義了與服務(wù)器交互的不同方法,其中最基本的四種:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被稱為安全方法,因為使用GET和HEAD的HTTP請求不會產(chǎn)生什么動作。不會產(chǎn)生動作意味著GET和HEAD的HTTP請求不會在服務(wù)器上產(chǎn)生任何結(jié)果。但是安全方法并不是什么動作都不產(chǎn)生,這里的安全方法僅僅指不會修改信息。
根據(jù)HTTP規(guī)范,POST可能會修改服務(wù)器上的資源的請求。比如知乎編寫文章,用戶提交一篇文章或者一個讀者提交評論是通過POST請求來實現(xiàn)的,因為再提交文章或者評論提交后資源(即某個頁面)不同了,或者說資源被修改了,這些便是“不安全方法”。
二、使用時最直觀的區(qū)別
最直觀的區(qū)別就是GET把參數(shù)包含在URL中,POST通過request body傳遞參數(shù)。
get請求:

post請求:

三、為什么get比post更快
1.post請求包含更多的請求頭
因為post需要在請求的body部分包含數(shù)據(jù),所以會多了幾個數(shù)據(jù)描述部分的首部字段(如:content-type),這其實是微乎其微的。
2.最重要的一條,post在真正接收數(shù)據(jù)之前會先將請求頭發(fā)送給服務(wù)器進(jìn)行確認(rèn),然后才真正發(fā)送數(shù)據(jù)
post請求的過程:
(1)瀏覽器請求tcp連接(第一次握手)
(2)服務(wù)器答應(yīng)進(jìn)行tcp連接(第二次握手)
(3)瀏覽器確認(rèn),并發(fā)送post請求頭(第三次握手,這個報文比較小,所以http會在此時進(jìn)行第一次數(shù)據(jù)發(fā)送)
(4)服務(wù)器返回100 Continue響應(yīng)
(5)瀏覽器發(fā)送數(shù)據(jù)
(6)服務(wù)器返回200 OK響應(yīng)
get請求的過程:
(1)瀏覽器請求tcp連接(第一次握手)
(2)服務(wù)器答應(yīng)進(jìn)行tcp連接(第二次握手)
(3)瀏覽器確認(rèn),并發(fā)送get請求頭和數(shù)據(jù)(第三次握手,這個報文比較小,所以http會在此時進(jìn)行第一次數(shù)據(jù)發(fā)送)
(4)服務(wù)器返回200 OK響應(yīng)
也就是說,目測get的總耗是post的2/3左右,這個口說無憑,網(wǎng)上已經(jīng)有網(wǎng)友進(jìn)行過測試。
3.get會將數(shù)據(jù)緩存起來,而post不會
可以做個簡短的測試,使用ajax采用get方式請求靜態(tài)數(shù)據(jù)(比如html頁面,圖片)的時候,如果兩次傳輸?shù)臄?shù)據(jù)相同,第二次以后消耗的時間將會在10ms以內(nèi)(chrome測試),而post每次消耗的時間都差不多。經(jīng)測試,chrome和firefox下如果檢測到get請求的是靜態(tài)資源,則會緩存,如果是數(shù)據(jù),則不會緩存,但是IE什么都會緩存起來,當(dāng)然,應(yīng)該沒有人用post去獲取靜態(tài)數(shù)據(jù)吧,反正我是沒見過。
四、面試是一般怎么回答get和post的區(qū)別
(1)post更安全(不會作為url的一部分,不會被緩存、保存在服務(wù)器日志、以及瀏覽器瀏覽記錄中)
(2)post發(fā)送的數(shù)據(jù)更大(get有url長度限制)
(3)post能發(fā)送更多的數(shù)據(jù)類型(get只能發(fā)送ASCII字符)
(4)post比get慢
(5)post用于修改和寫入數(shù)據(jù),get一般用于搜索排序和篩選之類的操作(淘寶,支付寶的搜索查詢都是get提交),目的是資源的獲取,讀取數(shù)據(jù)
五、測試get和post請求的工具
get和post請求一般使用的是接口測試工具,接口測試工具我個人一般使用的是:apipost和jmeter。
apipost是一款國產(chǎn)的接口測試工具和接口文檔生成工具,能夠滿足我們?nèi)粘9ぷ鳟?dāng)中對于接口測試和接口文檔生成的工作需求。接口文檔還可以支持多種格式的生成,有在線版、markdown、word版等多種格式的接口文檔。

jmeter可以進(jìn)行接口測試和性能測試,但是對于做單純的接口測試jmeter操作起來沒有apipost使用起來方便。jmeter重點在于壓力測試,穩(wěn)定性測試和負(fù)載測試。針對于接口和程序的穩(wěn)定性設(shè)計的一塊以軟件性能為主接口測試為輔的接口測試工具。

工具下載地址:https://www.apipost.cn
