Android中Fiddler的使用技巧

我啥時候說啦jj發表於2017-12-28

[TOC]

對於前端開發,Fiddler應該是比較常用的網路請求監聽工具了,之前為了跨平臺還想使用wireshark,但是發現相比起來不太友好,折騰過後才發現原來Fiddler也有linux和mac版本(多虧了.net開源,需要安裝mono,後面會有連結,當然體驗會差點),本文就介紹幾個有用卻被用得比較少的技巧(本文基於Fiddler V4.6);

Fiddler在客戶端和伺服器之間假設了一個代理,我們可以通過它對請求和響應進行各種操作,

原理

1. 下載安裝

win mac/linux linux中需要安裝mono:

sudo apt-get install mono-complete
mono Fiddler.exe 
複製程式碼

另外,也可以在mac中開啟虛擬機器執行windows系統然後執行Fiddler,具體可以參考 這篇文章 , 主要就是設定虛擬機器網路卡為 '橋接模式' 並記錄下ip,然後在mac中設定網路proxies為虛擬機器即可,若要抓取手機包,則將手機代理也設定為虛擬機器的ip即可;

主介面

2. 外掛安裝

Fiddler也可以安裝外掛,由於安裝的時候碰到點坑,這裡也記錄一下: 到 這裡 下載外掛,我下載了一個 Traffic Differ , 是個 exe 檔案,雙擊安裝並重啟Fiddler( File-exit ,然後重新啟動)後,選擇了任意兩個請求, 右鍵-compare(ctrl+w) ,提示我找不到 WinDiff.exe ,使用 EveryThing 搜尋後發現生成的 WinDiff.exeC:\Program Files (x86)\Microsoft WebMatrix 中,這個目錄不再我係統 path 環境變數下,導致找不到,新增下即可; P.S. 外掛執行後除了生成 WinDiff.exe外,還在 Fiddler2/Scripts 目錄下生成了 Differ.dll,可以檢視下,另外,外掛是否安裝也可以在 toolsTelerik Fildder OptionsExtensions 皮膚中檢視;

3. 開啟代理,實現請求中轉

1. 設定Fiddler埠,允許遠端連線

單擊選單欄: toolsTelerik Fildder OptionsConnections,進行如下設定,其中埠號可以自定義,不衝突即可,並允許遠端連線;

options

2. 手機端設定Wifi代理

當然,Fiddler安裝的主機要跟手機在同一個無線網路中,在手機中設定wifi代理引數,其中埠號就是Fiddler中設定的,而路由ip地址是Fiddler所在主機的網址:

手機wifi代理設定

至此我們就成功使用Fiddler作為手機的代理了;

3. Filters過濾器設定

主要設定好後,要單擊 Actions - Run Filterset Now 來使過濾條件生效

Filter

4. Composer模擬請求

可以直接拖拽會話列表中的已有請求到本頁面,修改資料後,execute執行,但是我們有另一個利器 postman,就不需要這裡了吧;

5. 模擬弱網路情況

直接上圖

選單開啟弱網路模擬

程式碼修改網速

6. 重定向資源/模擬資料

開發時候,通常客戶端和伺服器是兩撥人馬在做,經常是介面文件已出,但介面並未實現或者無資料或資料不完整,導致客戶端測試時候很痛苦,需要在程式中各種判斷各種假資料,使用Fiddler可以使用本地資源替換服務端的response即可;

另外,Fiddler支援多種url匹配的方式(可以從 url pattern 下拉選單中檢視):

  • 字元匹配 如輸入 csdn,可以匹配 http://www.csdn.net/ 或者 http://blog.csdn.net/
  • 精確匹配 以 EXACT 開頭表示完全匹配,如上邊的例子 EXACT:http://blog.csdn.net
  • 正規表示式匹配 以 regex: 開頭,如 regex:(?insx).*.(css)$ 表示匹配所有以css結尾的請求url ;

如下圖,可以指定某個請求url後,指定其要返回的資料,比如某個根據介面文件資訊生成的json檔案,雖然同樣都是造假資料,但是一來不影響程式邏輯,不增加程式碼,多人協同開發時,還方便複用和重現; P.S. 即可要勾選 Unmatched requests passthrough, 不然所有請求的返回都會被攔截的;

AutoResponder

7. 其他方式修改reqeust/response

常碰到需要測試某個資料的時候,服務端又沒有要求的資料,等著後臺生成資料或者使用上面的方法模擬全部資料都比較麻煩,我們其實可以直接修改response內容,然後再返回給客戶端的,這就是斷點功能(這裡以斷response為例);

P.S. 修改request的話可以如下圖

before request

1. 選單欄啟用斷點After responses

這種方式會對所有請求都進行斷點

automatic_breakpoints

response被斷點後,可以在 Inspectors - Response TextView 皮膚中直接修改返回的資料,也可通過 Choose Response 下拉選單中選擇預定義的模板或者 通過 find a file 來指定本地檔案作為resposne,類似上面說過的重定向資源:

直接修改資料

2. 命令列臨時斷點

選單欄開啟斷點會對所有請求都做斷點操作,不太方便,我們其實也可以臨時對符合指定條件的請求做斷點: 命令列中支援的幾個斷點方式如下:

// 當這些命令沒有加引數時,會清空所有設定了斷點的Http請求:
bpafter xxx: 中斷 URL 中包含指定字元的全部 session 響應
bps xxx: 中斷 HTTP 響應狀態為指定字元的全部 session 響應
bpv xxx: 中斷指定請求方式的全部 session 響應
bpm xxx: 中斷指定請求方式的全部 session 響應,等同於bpv xxx
bpu xxx:與bpafter類似
複製程式碼

比如輸入: bpafter csdn,就會對所有請求url中含有 csdn 請求,在返回時進行斷點操作; P.S. 其他比較有用的命令列:

?text 選擇所有 URL 匹配問號後的字元的全部 session
=status 選擇響應狀態等於給定狀態的所有HTTP請求
=method 選擇請求方式為指定method的請求會話,如 =get
>size 或者 <size 選擇響應大小大於/小於size(單位b)的請求,如 >1k
@host  選擇包含指定 host 的全部 HTTP請求
bold xxx 加粗滿足指定條件的會話名,如 bold  csdn,則包含 `csdn` 的請求會被加粗顯示
cls 或者 clear  清空會話列表,不過我習慣用快捷鍵ctrl+a ctrl+x來刪除
select xxx 選擇Content-Type頭中包含指定字串的響應,可用於選擇檔案格式,如 select image
go  跳過當前斷點,跟常用工具欄上的 `go` 按鈕功能一樣
urlreplace www.demo.com  www.dev.demo.com  將host為 'www.demo.com'的請求替換為'www.dev.demo.com'
複製程式碼

3. 指令碼配置修改

官方文件 其實跟從選單欄啟動斷點功能差不多,只不過更靈活, 通過 Rules - Customize Rules(Ctrl+R) 開啟編輯器,初次執行可能會提示安裝編輯器: 單擊編輯器選單 go - before OnBeforeResponse 會定位到 OnBeforeResponse 函式,在response返回給客戶端前會先進入該方法,我們可以在裡面進行某些設定:

if(oSession.uriContains("http://fepapi.debug.web.nd/v1/master_infos/2080998854")){
    oSession["ui-color"]="#0000ff";//設定顏色
    oSession.oResponse["newResponseHead"]="hello";//新增一個請求頭
    oSession.oResponse.headers.Remove("Date");//刪除請求頭,測試大小寫不敏感,request的類似
}
複製程式碼

我們可以修改 OnBeforeRequest 函式,對請求頭進行處理:

// 修改查詢路徑和條件 
if(oSession.PathAndQuery==”/v1/master_infos/2080998854”){//除主機名後面的完整部分 
    oSession[“ui-color”]=”red”;// 滿足條件時顯示顏色 
    oSession.PathAndQuery=”/v1/master_infos/2079941150”//修改查詢路徑 
}

//修改請求主機名 
if (oSession.HostnameIs(“fepapi.debug.web.nd”)) { 
    oSession.hostname=”www.baidu.com”; 
}
複製程式碼

擴充套件幾個小技巧:

1. 在會話列表中隱藏指定status的會話

可以參考 Rules - Hide 304s,隱藏304請求的寫法,我們在 Fiddler ScriptEditor中搜尋 304s,發現

// 在選單欄中增加一個選項,也可以不用的
public static RulesOption("Hide 304s")
BindPref("fiddlerscript.rules.Hide304s")
var m_Hide304s: boolean = false;

//搜尋布林值 `m_Hide304s`
static function OnBeforeResponse(oSession: Session) {      
  if (m_Hide304s && oSession.responseCode == 304) {
    oSession["ui-hide"] = "true";
  }
}
複製程式碼

8. 其他

部分快捷鍵

定位到命令列 : alt+q 快速改變會話行顏色 : ctrl+N (N為數字,0表示取消顏色,1為紅色 ... 可通過 右鍵-mark 檢視) 刪除選中的會話 : ctrl+x 反選會話 : ctrl+i (這個配合命令列過濾以及ctrl+x可以讓會話列表變得清爽清晰很多)

9. 參考資料

  1. 官方文件
  2. Fiddler Script 與 HTTP 斷點除錯
  3. 除錯之Fiddler修改返回結果Response
  4. Fiddler(一)-Fiddler簡介
  5. Fiddler(二)-使用Fiddler做抓包分析
  6. Fiddler(三)-Fiddler命令列和HTTP斷點除錯
  7. 用Fiddler模擬低速網路環境
  8. Fiddler常用命令
  9. Mac/linux下使用Fiddler-虛擬機器

相關文章推薦: Charles的使用

相關文章