Fiddler
(中文名稱:小提琴)是一個HTTP
的調試代理,以代理服務器的方式,監聽系統的Http網絡數據流動, Fiddler
可以也可以讓你檢查所有的HTTP
通訊,設置斷點,以及Fiddle
所有的“進出”的數據(我一般用來抓包),Fiddler
還包含一個簡單卻功能強大的基于JScript .NET
事件腳本子系統,它可以支持眾多的HTTP
調試任務。
Fiddler官方網站提供了大量的幫助文檔和視頻教程,這是學習Fiddler的最好資料
Fiddler
是以代理WEB服務器的形式工作的,瀏覽器與服務器之間通過建立TCP連接以HTTP協議進行通信,瀏覽器默認通過自己發送HTTP請求到服務器,它使用代理地址:127.0.0.1
, 端口:8888
. 當Fiddler
開啟會自動設置代理, 退出的時候它會自動注銷代理,這樣就不會影響別的程序。不過如果Fiddler
非正常退出,這時候因為Fiddler
沒有自動注銷,會造成網頁無法訪問。解決的辦法是重新啟動下Fiddler
.
協議是指計算機通信網絡中兩臺計算機之間進行通信所必須共同遵守的規定或規則,超文本傳輸協議(HTTP)是一種通信協議,它允許將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器,目前我們使用的是HTTP/1.1 版本。
URL(Uniform Resource Locator)
地址用于描述一個網絡上的資源, 基本格式如下
schema://host[:port#]/path/.../[?query-string][#anchor]
名稱 | 解釋 |
---|---|
scheme | 指定低層使用的協議(例如:http, https, ftp) |
host | HTTP服務器的IP地址或者域名 |
port# | HTTP服務器的默認端口是80,這種情況下端口號可以省略。如果使用了別的端口,必須指明,例如 http://www.test.com:8080/ |
path | 訪問資源的路徑 |
query-string | 發送給http服務器的數據 |
anchor | 錨 |
第一行中的Method表示請求方法,比如"POST","GET", Path-to-resoure表示請求的資源, Http/version-number 表示HTTP協議的版本號,當使用的是"GET" 方法的時候, body是為空的
Response 消息中的第一行叫做狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.
HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別
狀態碼 | 解釋 |
---|---|
1XX | 提示信息,表示請求已被成功接收,繼續處理 |
2XX | 成功,表示請求已被成功接收,理解,接受 |
3XX | 重定向,要完成請求必須進行更進一步的處理 |
4XX | 客戶端錯誤,請求有語法錯誤或請求無法實現 |
5XX | 服務器端錯誤,服務器未能實現合法的請求 |
200 OK
最常見的就是成功響應狀態碼200了, 這表明該請求被成功地完成,所請求的資源發送回客戶端
302 Found
重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request
例如在IE中輸入, http://www.google.com. HTTP服務器會返回302, IE取到Response中Location header的新URL, 又重新發送了一個Request.
304 Not Modified
代表上次的文檔已經被緩存了, 還可以繼續使用,例如打開博客園首頁, 發現很多Response 的status code 都是304
[提示: 如果你不想使用本地緩存可以用Ctrl+F5 強制刷新頁面]
403 Forbidden 服務器收到請求,但是拒絕提供服務
404 Not Found
503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
Fiddler
的主界面分為 工具面板、會話面板、監控面板、狀態面板,下面進行一一介紹。
說明
注釋、重新請求、刪除會話、繼續執行、流模式/緩沖模式、解碼、保留會話、監控指定進程、尋找、保存會話、切圖、計時、打開瀏覽器、清除IE緩存、編碼/解碼工具、彈出控制監控面板、MSDN、幫助
兩種模式
緩沖模式(Buffering Mode
)Fiddler
直到HTTP
響應完成時才將數據返回給應用程序。可以控制響應,修改響應數據。但是時序圖有時候會出現異常
流模式(Streaming Mode
)Fiddler
會即時將HTTP
響應的數據返回給應用程序。更接近真實瀏覽器的性能。時序圖更準確。但是不能控制響應。
(1) 請求總數、請求包大小、響應包大??;
(2) 請求起始時間、響應結束時間、握手時間、等待時間、路由時間、TCP/IP
傳輸時間;
(3) HTTP
狀態碼統計;
(4) 返回的各種類型數據的大小統計以及餅圖展現。
Fiddler
中,只要在左側選中一些請求,右側選擇Timeline
標簽,就可以看到這些請求的瀑布圖看到這張圖,你是否可以回答這些問題:
綠色的請求表示這是一個“有條件的請求”。HTTP 協議定義了 5 個條件請求頭部,最常見的兩個是“If-Modified-Since”和“If-None-Match”。服務器根據這兩個頭部來驗證本地緩存是否過期,如果過期則正常返回資源的最新版本;否則僅返回 304 Not Modified,瀏覽器繼續使用本地緩存。包含條件請求頭部的請求用綠色顯示,否則用黑色。
有陰影線的請求是緩沖模式下的請求,實心的是流模式下的請求。Fiddler 提供了緩沖(Buffering)和流(Streaming)兩種抓包模式:緩沖模式下,Fiddler 會在響應完成時才將數據返回給應用程序(通常是瀏覽器),這種模式下可以控制響應,方便地修改響應內容;流模式下,Fiddler 會實時返回響應數據給瀏覽器,但沒辦法控制響應。一般使用流模式,瀑布圖會更真實一些。這兩種模式可以通過 Fiddler 的工具欄選擇。特別的,通過 Fiddler 的“AutoResponder”功能返回的響應,只能是緩沖模式。
請求條的不同顏色對應著不同類型的響應,根據響應頭的 MIME Type 來歸類。如淺綠色表示圖片類型的響應;深綠色是 javaScript;紫色是 CSS;其它都是藍色。
請求中的黑色豎線,表示的是瀏覽器收到服務端響應的第一個字節這一時刻。這個時間受 DNS 解析、建立連接、發送請求、等待服務端響應等步驟的影響。
請求條后面的圖標表示響應的某些特征。如軟盤圖標表示這個響應正文從本地獲得,也就是說服務端返回了 304;閃電表示這是 Fiddler 的“AutoResponder”的響應;向下的箭頭表示響應是 302,需要重定向;紅色感嘆號說明這個請求有錯誤發生(狀態碼是 4XX 或 5XX)。特別的,如果請求條后面有一個紅色的X,說明服務端響應完這個請求之后,斷開了連接。出現這種情況一般有兩種可能:HTTP/1.0 的響應中沒有 Connection: Keep-Alive;或者是 HTTP/1.1 的響應中包含了 Connection: close。使用持久連接可以省去建立連接的開銷,也可以減小 TCP 慢啟動和其它擁塞控制機制帶來的影響,總之是好處多多。
請求前面的紅色圓圈表示這個連接是新建的,綠色表示是復用的。上面的圓圈表示的是瀏覽器到 Fiddler 的連接,下面的圓圈是 Fiddler 到服務端的連接。
命令 | 解釋 |
---|---|
help | 打開官方的使用頁面介紹,所有的命令都會列出來 |
cls | 清屏 (Ctrl+x 也可以清屏) |
select | 選擇會話的命令 |
?.png | 用來選擇png后綴的圖片 |
bpu | 截獲request |
bpafter | 截獲response |
Fiddler不僅能監聽HTTP請求而且默認情況下也能捕獲到HTTPS請求,Tool -> Fiddler Option -> HTTPS下面進行設置,勾選上“Decrypt HTTPS traffic”,如果不必監聽服務器端得證書錯誤可以勾上“Ignore server certification errors”,也可以跳過幾個指定的HOST來縮小或者擴大監聽范圍。
HTTPS例子:
https://pay.tenpay.com/main/app/v1.0/trans_manage.cgi?OutPutType=JSON
根據一些場景自定義規則
低網速模擬
有時出于兼容性考慮或者對某處進行性能優化,在低網速下往往能較快發現問題所在也容易發現性能瓶頸,可惜其他調試工具沒能提供低網速環境,而強大的Fiddler考慮到了這一點,能夠進行低網速模擬設置Rules > Performance > Stimulate Modem Speeds。
請求構造顧名思義就是我們可以模擬請求,也就是說我們可以借助Fiddler的Composer 在不改動開發環境實際代碼的情況下修改請求中的參數值并且方便的重新調用一次該請求,然后相比較2次請求響應有何具體不同。任何一個請求參數只要是合法的取值再次調用后都會有相應的響應,那么你想要的任意一個合法請求組合自然也能夠按照你的意愿構造出來,然后再次調用以及查看返回數據,十分方便!
下面舉一個交易查詢請求構造的例子。首先進入交易查詢頁面抓包找到目標請求https://pay.tenpay.com/main/app/v1.0/trans_manage.cgi?OutPutType=JSON,雙擊該包在Inspectors標簽下查看返回數據為JSON格式,而xml格式一欄為空:
將該請求鼠標左鍵單擊拖入Fiddler右側Request Builder標簽內并修改原請求參數OutPutType=JSON為OutPu tType=XML,然后點擊Execute按鈕再次觸發調用請求,
雙擊這次請求包在Inspectors標簽下查看返回數據為XML格式,而JSON格式一欄為空:
對一個重新載入的頁面進行抓包,如果包的條目過多而你需要關注的就那么幾項的話,可以使用Fiddler的過濾器Filters進行抓包,那么抓包時只會抓取你希望抓到的那些包。切換到Filters標簽勾選Use filter,以便激活過濾器,這樣下面的各種過濾方式就可以進行選擇了。
(1).
(2).
選項1 | 解釋 |
---|---|
No zone filter | 不設置hosts過濾 |
Show Only Intranet Hosts | 只顯示內網HOST |
Show Only Internet Hosts | 只顯示外網HOST令 |
選項2 | 解釋 |
---|---|
No Host Filter | 不設置hosts過濾 |
Show Only The Following Hosts | 隱藏過濾到的域名 |
Show Only The Following Hosts | 只顯示過濾到的域名 |
Flag The Following Hosts | 標記過濾到的域名 |
所謂請求無非就是需要調用到的一些資源(包括JS、CSS和圖片等),所謂重定向就是將頁面原本需要調用的資源指向其他資源(你能夠控制的資源或者可以引用到的資源)。
(1)你可以將前臺服務器的諸多或者某個資源在本地做個副本,如果正常網絡訪問環境下該資源出現了BUG而導致開發環境崩潰時,可以先將這個資源的請求重定向到本地副本,這樣就可以繼續進行開發調試你的頁面,從而大量節省資源維護的等待時間。
(2)你也可以將多人同時維護的某個JS文件復制一份出來在本地,當你的開發調試收到他人調試代碼干擾時,可以將這個JS的調用重定向到本地無干擾的JS文件,進行無干擾開發,功能開發完成并調試OK之后再將你的代碼小心合入到開發環境中,這樣就可以避免受到他人干擾專心搞你的模塊開發,也就是說能夠將JS文件脫離開發環境卻不影響線上調試。
(3)你還可以將樣式文件或者圖片指向本地如果需要的話。開發過程中的很多頁面其實都是慘不忍睹的,究其原因很大程度上是因為缺少對應的樣式文件或者沒有圖片資源,所以樣式文件和圖片的重定向會對美感稍有要求的開發人員帶來福音。
Fiddler Script 是用JScript.NET語言寫的,
JScript.NET
在這個方法中修改Request的內容, 我們用得最多,
static function OnBeforeRequest(osession: Session)
在這個方法中修改Response的內容,
static function OnBeforeResponse(oSession: Session)
添加IP Main方法中添加
FiddlerObject.UI.lvSessions.AddBoundColumn("HostIP", 50, "x-hostIP");
請求,響應延遲 在OnBeforeRequest 添加
oSession["request-trickle-delay"] = "3000"; oSession["response-trickle-delay"] = "3000";
我們可以控制Session在Fiddler中顯示的樣式,把這段腳本放在OnBeforeRequest(oSession: Session) 方法下,并且點擊"Save script", 這樣所有的VEVb的會話都會顯示紅色.
if (oSession.HostnameIs("www.companysz.com")) { oSession["ui-color"] = "red"; }
Fiddler Script中修改Cookie
Cookie其實就是request 中的一個header,注意:FiddlerScript不能直接刪除或者編輯單獨的一個cookie, 你需要用replace方法或者正則表達式的方法去操作cookie的string
static function OnBeforeRequest(oSession: Session) { if (oSession.HostnameIs('www.example.com') && oSession.uriContains('pagewithCookie') && oSession.oRequest.headers.Contains("Cookie")) { var sCookie = oSession.oRequest["Cookie"]; // 用replace方法或者正則表達式的方法去操作cookie的string sCookie = sCookie.Replace("cookieName=", "ignoreme="); oSession.oRequest["Cookie"] = sCookie; }
刪除所有的cookie
oSession.oRequest.headers.Remove("Cookie");
新建cookie
oSession.oRequest.headers.Add("Cookie", "username=testname;testpassWord=P@ssword1");
Fiddler Script中修改Request 中的body
static function OnBeforeRequest(oSession: Session) { if(oSession.uriContains("http://www.companysz.com/")) { // 獲取Request 中的body字符串 var strBody=oSession.GetRequestBodyAsString(); // 用正則表達式或者replace方法去修改string strBody=strBody.replace("1111","2222"); // 彈個對話框檢查下修改后的body FiddlerObject.alert(strBody); // 將修改后的body,重新寫回Request中 oSession.utilSetRequestBody(strBody);}}
VS插件:https://visualstudiogallery.msdn.microsoft.com/872d27ee-38c7-4a97-98dc-0d8a431cc2ed
.NET可以開發
插件管理
我們在用visual stuido 開發asp.net網站的時候也需要用Fiddler來分析HTTP, 默認的時候Fiddler是不能嗅探到localhost的網站。
在localhost后面加個點號,Fiddler就能嗅探到。
例如:原本ASP.NET的地址是 http://localhost:2391/Default.aspx, 加個點號后,變成 http://localhost.:2391/Default.aspx 就可以了
Fiddler不但能截獲各種瀏覽器發出的HTTP請求, 也可以截獲各種智能手機發出的HTTP/HTTPS請求。
Fiddler能捕獲IOS,Andriod,WinPhone,設備發出的請求,同理,也可以截獲IPad, MacBook的等設備發出的HTTP/HTTPS。
前提條件是:安裝Fiddler的機器,跟Iphone 在同一個網絡里, 否則IPhone不能把HTTP發送到Fiddler的機器上來。
具體操作步驟如下:
選中"Allow remote computers to connect". 是允許別的機器把HTTP/HTTPS請求發送到Fiddler上來
獲取Fiddler所在機器的IP
安裝Fiddler證書
這一步是為了讓Fiddler能捕獲HTTPS請求。 如果你只需要截獲HTTP請求, 可以忽略這一步
首先要知道Fiddler所在的機器的IP地址: 假如我安裝了Fiddler的機器的IP地址是:192.168.1.104
打開IPhone 的Safari, 訪問 http://192.168.1.104:8888, 點"FiddlerRoot certificate" 然后安裝證書
《Fiddler調試權威指南》是Fiddler的開發者Eric Lawrence編寫的一本權威的參考指南。全書分為10章和4個附錄,從認識Fiddler開始,介紹了基本技巧和概念、配置選項、Inspectors、擴展、數據流導入導出、FiddlerScript和FiddlerCore等主題;附錄部分還給出了故障排除和命令行等有用的參考信息。
《Fiddler調試權威指南》適合Web開發人員和Web測試人員閱讀參考,也適合想要學習和掌握Fiddler的讀者閱讀。通過《Fiddler調試權威指南》,你將學會如何利用Fiddler調試Web相關的應用,掌握如何調試HTTPS數據流,學會如何在流行的設備上使用Fiddler,甚至掌握更多高級的擴展功能。
同類的工具有 : HttpWatch, Firebug,Chrome自帶調試工具,WireShark
通過以上的介紹,你應該已經發現fiddler其它強大的功能。fiddler絕對是開發利器。
HTTP
和HTTPS
請求,允許你監視、設置斷點,甚至修改輸入輸出數據,Fiddler包含了一個強大的基于事件腳本的子系統,并且能使用.NET
語言進行擴展;HTTP
協議越了解,你就能越掌握Fiddler的使用方法,你越使用Fiddler,就越能幫助你了解HTTP
協議,兩者關系緊密、相輔相成;Coder
還是Tester
來說,都是非常有用的工具。
|
新聞熱點
疑難解答