利用抓包工具Fiddler分析post和get對http請求、響應的區別。


    

被面試官問到關於post和get的區別,由於只是使用,沒有思考,所以答的一塌糊塗,所以利用抓包工具來從http的請求和響應來具體分析,做做筆記。

 

擴展部分參考博客:https://www.cnblogs.com/logsharing/p/8448446.html

 

實驗工具:1.tomcat服務器

        2.Fiddler抓包工具

 

實驗步驟:

1.啟動Fiddler抓包工具

image

由於正在更新eclipse插件,所以可以看到eclipse大量的連接

 

2.打開tomcat服務器

image

 

3.打開網頁進入localhost:8080

image

4.然后在Developer Quick Start下通過Examples測試

image

5.點擊第一個servlets測試之后,點擊下面的Request Headers的執行

image

6.你在網頁上將看到

image

7.然后回到fiddler界面就可以看到這個過程

image

image

8.但是因為我們要測試的是post和get,所以重新回到Tomcat下的example界面,去執行

image

9.輸入名字后點擊提交

image

10.回來查看對接的細節。

image

上面的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”即可

image

image

 

於是發現了區別,與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在驗證數據包完整性上有巨大的優點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM