Fiddler實踐心得
本文章轉載於搜狗測試
一、打斷點和AutoResponder返回404/502等狀態碼的不同
之前一直以為這兩種方式沒有區別,都是阻斷了請求,改變了返回結果。但是今天在測一個問題時,恍然間明白了兩者的不同。
1、打斷點,是阻塞了請求,一直沒有結果返回,請求將線上程中一直存在,直到超時被踢出來。
2、AutoResponder返回404/502,這種情況是有結果返回的,代表請求也結束了,不會線上程中一直存在。
執行緒,細心的朋友可能發現了,執行緒,是的,在遇到執行緒相關的問題時,兩者就明顯的不同了。
其實在發現兩者線上程上的不同之後,再仔細思考這個問題,兩者本質上是伺服器是否響應的問題,是否有狀態碼的問題。打斷點阻塞,沒有狀態碼,伺服器是沒有響應。404/502是伺服器有響應的。體現中執行緒中的不同,只是一個症狀體現而已。
二、修改Response資料時要注意超時的問題
通過設定Rules -> Automatic Breakpoints ->After Response,之後再修改響應回來的資料,來實現修改response的內容。但是這樣修改資料很容易造成另外一個問題,那就是請求超時導致客戶端不對請求做處理。
怎麼理解呢? 就是客戶端傳送一個請求出去,如果在指定的時間內請求沒有返回,則認為該請求超時了,就算以後這個請求返回資料,則客戶端也不再對請求做出響應。
如果,修改內容的操作能夠很快的進行,放行斷點,在超時時間之內完成,那麼修改之後的內容將會被客戶端處理。
如果,修改內容的操作大於超時時間,就算之後將斷點放行,請求返回200,這個時候客戶端是不做任何處理的,也可以理解為修改的內容沒有產生效果。
綜合上述,一定要注意修改內容的操作時間和超時時間的關係。
其實在修改資料的時候,不太容易去把控時間的長短,也很容易造成修改資料失誤,那麼怎麼樣才能很好的解決這個問題呢?
可以用AutoResponder自動響應資料,用本地檔案替換伺服器的返回資料。這樣就不用在打斷點之後急忙的修改資料,也不怕一不小心把資料修改錯了。AutoResponder功能替換是一瞬間的事兒,也不用擔心超時的問題,真的是一舉兩得啊。
三、重新認識Decode
在之前的認識中,知道有這樣的Decode在工具欄中,也知道是解密的,但是在實踐中並沒有涉及到這塊,今天就被我碰到了,而且自己也跳到坑裡了,還好還好最後終於明白了。
Decode在平時預設是被選中的,我不知道什麼時候就給取消了。
今天的情況是這個樣子的:
客戶端請求一個介面的資料是加密的,通過save -> response -> response body ,將返回結果儲存下來,之後用這個本地檔案替換伺服器返回的資料。結果客戶端接到資料之後,在後臺報了一個錯誤,提示資料格式不對。
正常的業務流程是客戶端在接到資料之後,需要對資料進行解密。現在是在對資料解密的時候發現資料格式不對。
儲存下來的response body,如下所示:
服務端一陣排查問題,客戶端一陣排查問題,沒毛病啊!!!最後問我,你的本地檔案內容是什麼?我把內容貼出去之後,大家都是很疑問 6 、0 是怎麼回事?
服務端說不是我們返回的,客戶端說不是我們新增的。
OH MY GOD ! 我也急了,怎麼可能是我這裡的問題,平時都是這樣用本地檔案替換伺服器檔案的,沒毛病啊!
後來仔細瞅了瞅,發現了 Response body is encoded ,Click to decode . 點了一下,哦~~~頓時豁然開朗。
第一行和最後一行是數字,其實是對資料failed加的密,雖然看起來是明文,6是資料failed的長度。
應該也看到Response body is encoded. Click to decode. understand ? 點選一下就可以解密了。
解密之後的資料,如下所示:
這個時候再save -> response -> response body ,將返回結果儲存下來,AutoResponder替換伺服器檔案,客戶端就可以正常的解密執行了。
問題雖然是解決了,但是得找到真正的原因啊?
提到解密,當然是第一時間想到了Decode,一看,居然沒有被選中,突然間就明白了Decode的作用,如果返回的資料時加密的,就自動解密。
為了驗證,選中Decode,又重新請求了一次,結果你猜怎麼著,還真的是這個道理。
細節決定成敗啊,任何一個小功能都不能被忽視啊!盆友們啊,都要慎重啊,慎重!
四、bpu 阻塞多個請求
背景:
今天同事問我,bpu怎麼同時阻塞多個請求呢?
同事 :
我是這樣寫的 bpu a b ,我這樣寫怎麼實現不了同時阻塞a 和 b 請求呢?
我:
我沒有這樣阻塞過,但是在我的理解裡應該這樣寫,bpu a enter執行,bpu b enter執行,分開執行(因為我之前沒有這樣阻塞過,只是按照自己的理解這樣認為的,接下來就打臉了,不都是你以為的就是你以為的啊,淚奔啊)。
同事:
我按照你說的方式做了,但是還是不可以啊。
額~,好尷尬啊
我只有默默的開啟Fiddler,ctr+R開啟指令碼,ctr+F 輸入關鍵字 bpu,找到bpu命令所在的核心程式碼
case "bpu":
var len = sParams.Length ;
if(sParams.Length<2){
bpRequestURI=null; FiddlerObject.StatusText="bpRequestURI breakpoint cleared";
return false;
}
var len = sParams.Length ;
bpRequestURI= sParams[1];
FiddlerObject.StatusText="RequestURI breakpoint for "+sParams[1];
return true;
核心: bpRequestURI= sParams[1]; 只取了一個引數值。
場景1解析(也就是同事的執行方法): bpu /sdk /zwf ,
使用空格隔開的,那麼
sParams[0] = “bpu”
sParams[1] = “/sdk”
sParams[2] = “/zwf”
只取了sParams[1] = “/sdk”,所以只會阻塞包含/sdk的請求
場景2解析(也就是我認為的方法,允許我哭一會):
bpu /sdk
bpu /zwf
每次執行bpRequestURI,都會被賦新值,所以我阻塞包含/zwf 的請求
我們怎麼樣才可以實現,阻塞多個請求呢?
讓我沿著核心程式碼,順藤抹瓜,ctr+F 輸入關鍵字 bpRequestURI 查詢,找到引數定義的地方
這個是定義變數的地方,是全域性變數
//在main()方法中
// These static variables are used for simple breakpointing & other QuickExec rules
BindPref("fiddlerscript.ephemeral.bpRequestURI")
publicstaticvarbpRequestURI:String=null;
找到使用此引數,bpRequestURI 不為null,並且 請求的uri 包含bpRequestURI ,則阻斷該請求
if((null!=bpRequestURI) && oSession.uriContains(bpRequestURI)) {
oSession["x-breakrequest"]="uri";
}
這樣捋下來,就搞明白了,阻塞請求是怎麼個原理了,是不是也很簡單呢?!
接下來就是改造它來實現bpu 阻塞多個請求了。
第一步:
//在main()新增如下程式碼
BindPref(“fiddlerscript.ephemeral.bpRequestURI”)
//陣列的長度10,10個阻塞的命令,內容為空格,和bpu命令用空格分割保持一致
public static var bpRequestURIs:String[] = [” “,” “,” “,” “,” “,” “,” “,” “,” “,” “] ;
第二步:
case"bpu":
varlen1 = sParams.Length ;
varlen2 = bpRequestURIs.Length;
//每次賦值之前先恢復原始值
for(vari =0; i< len2; i++){
bpRequestURIs[i]=" ";
}
if(len1 <2) {bpRequestURI=null; FiddlerObject.StatusText="RequestURI breakpoint cleared";returnfalse;}
vartext ="";
for(vari =1; i < len1; i++){
bpRequestURIs[i-1] = sParams[i];
text += sParams[i] +" ";
}
FiddlerObject.StatusText="RequestURI breakpoint for "+ text;
returntrue;
第三步:
// 在OnBeforeRequest() 方法中
// 註釋掉之前的方法
// if ((null!=bpRequestURI) && oSession.uriContains(bpRequestURI)) {
// oSession["x-breakrequest"]="uri";
// }
varlen= bpRequestURIs.Length;
for(vari =0; i
if(bpRequestURIs[i]!=null && bpRequestURIs[i]!=" "&& oSession.uriContains(bpRequestURIs[i]) ){
oSession["x-breakrequest"]="uri";
}
}
完成,這樣就完成了bpu同時阻塞多個請求了!
相關文章
- 一次全棧實踐心得全棧
- 專案管理培訓實踐心得專案管理
- linux平時的實踐心得Linux
- rabbitmq 實踐與學習心得分享(1)MQ
- 《一線架構師實踐指南》讀書心得架構
- 擁抱變化——持續整合(CI)實踐心得
- Oracle效能調優實踐中的幾點心得Oracle
- 設計、開發一個 Flutter Plugin 的實踐心得FlutterPlugin
- Oracle效能調優實踐中的幾點心得(zt)Oracle
- Oracle效能調優實踐中的幾點心得 (轉)Oracle
- 實驗心得
- Fiddler 實用功能總結
- 《單核工作法圖解》思維導圖及實踐心得單核圖解
- [心得]程式設計語言實踐之路第2版知識整理程式設計
- C#課外實踐——校園二手平臺(心得篇)C#
- 【HTTP】Fiddler(一) - Fiddler簡介HTTP
- Fiddler
- 用fiddler實現手機抓包
- 網際網路架構實踐心得:業務程式碼究竟難不難寫?架構
- Fiddler工具
- 實踐心得:從讀論文到復現到為開源貢獻程式碼
- 從工作流狀態機實踐中總結狀態模式使用心得模式
- Fiddler(三)Fiddler設定手機抓包
- [Fiddler]使用fiddler獲取http請求返回HTTP
- fiddler 實現 微信(PC端)小程式抓包
- Fiddler(一)Fiddler介紹及應用場景
- 朱曄的網際網路架構實踐心得S1E1:Pilot架構
- Fiddler簡介
- fiddler學習
- Fiddler 使用教程
- 前端面試&滴滴實習心得前端面試
- 『言善信』Fiddler工具 — 17、Fiddler常用外掛(Willow)
- 『言善信』Fiddler工具 — 1、Fiddler介紹與安裝
- 『言善信』Fiddler工具 — 7、Fiddler統計(Statistics)詳解
- Mac 安裝 fiddlerMac
- fiddler抓取httpsHTTP
- fiddler顯示埠
- fiddler斷點功能斷點