被面試官問到關於post和get的區別,由於只是使用,沒有思考,所以答的一塌糊塗,所以利用抓包工具來從http的請求和響應來具體分析,做做筆記。
擴展部分參考博客:https://www.cnblogs.com/logsharing/p/8448446.html
實驗工具:1.tomcat服務器
2.Fiddler抓包工具
實驗步驟:
1.啟動Fiddler抓包工具
由於正在更新eclipse插件,所以可以看到eclipse大量的連接
2.打開tomcat服務器
3.打開網頁進入localhost:8080
4.然后在Developer Quick Start下通過Examples測試
5.點擊第一個servlets測試之后,點擊下面的Request Headers的執行
6.你在網頁上將看到
7.然后回到fiddler界面就可以看到這個過程
8.但是因為我們要測試的是post和get,所以重新回到Tomcat下的example界面,去執行
9.輸入名字后點擊提交
10.回來查看對接的細節。
上面的http請求數據
請求行:
POST http://localhost:8080/examples/servlets/servlet/RequestParamExample HTTP/1.1
前面的post指的是請求的方式,以post的方式去提交數據,后面跟的是請求的地址路徑,也就是訪問的地方,最后的HTTP/1.1是http協議的版本。
請求頭:
Host: localhost:8080
主機地址
Connection: keep-alive
Keep-Alive 保持連接
Content-Length: 30
內容、數據長度
Cache-Control: max-age=0
對緩存的操作
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: application/x-www-form-urlencoded
提交的數據類型。經過urlencoding編碼的form表單的數據
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3641.400 QQBrowser/10.4.3284.400
用戶代理 向服務器表明,當前來訪的客戶端信息。 可以進行安卓/pc/ios區分
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
客戶端向服務器端表示,我能支持什么類型的數據。
Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample
真正請求的地址路徑,全路徑
Accept-Encoding: gzip, deflate, br
壓縮算法 當客戶端請求大數據時,服務器端先壓縮再發送給客戶端,3種壓縮方式
Accept-Language: zh-CN,zh;q=0.9
支持語言格式
請求體:(瀏覽器真正發送給服務器的數據)
firstname=Haim&lastname=Edward
發送的數據呈現的是key=value ,如果存在多個數據,那么使用 &,使用ket=value,服務器解析方便
再看http響應數據解析
響應行:
HTTP/1.1 200 OK
3個數據對應着,協議版本 狀態碼 以及交互的結果code(code對應前面的狀態碼)
響應頭:
Server: Apache-Coyote/1.1
服務器是哪一種類型
Content-Type: text/html;charset=UTF-8
服務器返回給客戶端你的內容類型,utf-8編碼
Content-Length: 713
返回的數據長度,下面的html標簽內的數據也要計算
Date: Wed, 20 Mar 2019 12:45:45 GMT
通訊的日期,響應的時間
響應體:
即整個html標簽
那么post的數據有了,怎么去測試get請求呢?
很簡單,get請求的使用方式之一,就是在路徑后跟上?和數據,所以在原先測試網址的后面輸入“?firstname=Haim&lastname=Edward”即可
於是發現了區別,與post的對比總結
1.首先,請求方式就變了,從post變成了get
2.請求的路徑邊了,因為我們就是通過在url后面跟上數據,才實現的get請求,post在url后是不跟任何數據的。
3.谷歌后發現,post中數據是以流的方式寫過去的,而get帶數據的方式是在地址欄上添加。
4.因為第3點,導致get方法會把數據放置在url中,所以存在安全隱患
5.仍然因為第3點,因為是在地址欄上拼接的數據,所以get方法能攜帶的數據有限,只有1kb大小,而post因為以流的方式寫數據,所以數據大小沒有限制。
6.也因為post請求用流的方式寫數據,所以post請求還多了一個content-Length的頭來聲明數據的長度。
7.並且因為post以流的方式寫數據,所以跟get后面用紅色圈起來的那個地方不同,會出現攜帶的數據。
擴展:
1.關於傳輸效率的問題,get會把http header和data一起發送出去,服務器響應200。而post方式,會先發送header,服務器相應100,然后瀏覽器再發送data,服務器響應200.
2.但上述的情況,在網絡好的情況下,發1次包和2次包的時間差別基本可以忽略不計,而網絡差的情況下,兩次包的tcp在驗證數據包完整性上有巨大的優點。