0、寫在前面的話
之前看了阮一峰老師關於互聯網協議入門的博客,受益匪淺,接着再去體會了下HTTP協議,就想着看實際網絡訪問中的那些HTTP請求頭和響應是什么樣的。Chrome的調試工具的Network選項其實已經夠用了,但是其格式為了方便觀看做了調整,我想看原生的,就從網友處得知了比較專業的抓包工具:Fiddler。
基本使用還是比較簡單的,可以直接參考博客《
Fiddler 教程》。這里想要吐槽的是,本人電腦的不知道什么環境導致的Fiddler無法抓取網頁的https請求,這個設置是可以直接在軟件上打開的,然而我的電腦始終開啟后不生效,各種谷歌各種調鼓搗了超過4h仍然無果!現在那么多網站都開始用https,不能抓取https的抓包工具豈不是逐漸成為一只咸魚了。而我在同事同樣的win10 x64電腦同版本Fiddler設置抓取https,只按照普通設置花了大概3min不到就OK了,我的心態是崩潰的,謝謝。
另外,本文涉及的如何讓手機端也能在電腦上通過Fiddler抓包分析,請參考鏈接《
fiddler 手機 https 抓包》,主要參考文中的代理設置部分,如果不是抓取https,其他的如證書安裝可以略過。
1、背景介紹
之前看到一篇博客關於Fiddler的好處在於可以在實際線上環境調整腳本代碼,即攔截腳本,本地修改后返回,在真實的環境下去調試,從而最大限度的減少bug發生的可能性。沒想到,昨天晚上就給我遇到了,老大問我公眾號的微信綁定為什么點擊確定按鈕之后沒有反應,最終定位發現綁定在后台是生效了,Ajax反饋前端的響應前端也收到了,問題在於回調函數。
$(function(){
//綁定
$("#bound").click(function() {
var username = $("#username").val();
var password = $("#password").val();
if(username.trim() == "" || password.trim() == "") {
weui.topTips('用戶名或密碼不得為空', 1500);
return;
}
$().invoke("/weChat/grading/do/checkDepartment.q", {username:username, password:password}, function(re) {
if(re == 'error') {
weui.topTips('用戶名或密碼錯誤', 1500);
} else {
weui.confirm('綁定考級點:' + re,
//確定
function() {
$().invoke("/weChat/grading/do/bound.q", {username:username, password:password}, function(re) {
if('success' == re) {
weui.alert('綁定成功', function() {
wx.closeWindow();
});
} else {
weui.alert(re);
}
});
},
//取消
function() {
//none
});
}
});
});
});
1
$(function(){
2
//綁定
3
$("#bound").click(function() {
4
var username = $("#username").val();
5
var password = $("#password").val();
6
if(username.trim() == "" || password.trim() == "") {
7
weui.topTips('用戶名或密碼不得為空', 1500);
8
return;
9
}
10
$().invoke("/weChat/grading/do/checkDepartment.q", {username:username, password:password}, function(re) {
11
if(re == 'error') {
12
weui.topTips('用戶名或密碼錯誤', 1500);
13
} else {
14
weui.confirm('綁定考級點:' + re,
15
//確定
16
function() {
17
$().invoke("/weChat/grading/do/bound.q", {username:username, password:password}, function(re) {
18
if('success' == re) {
19
weui.alert('綁定成功', function() {
20
wx.closeWindow();
21
});
22
} else {
23
weui.alert(re);
24
}
25
});
26
},
27
//取消
28
function() {
29
//none
30
});
31
}
32
});
33
});
34
});
2、方法1:Fiddler斷點抓包改響應
既然大概知道是回調函數出了問題,那么先來判斷是回調函數沒有調用,還是回調函數中的方法沒生效,還是條件進入出現了問題。
Fiddler可以在響應返回之前的“
請求之前”和“
請求之后”兩種狀態進行斷點,分別
可以修改即將發送出去的請求和即將返回的響應,兩種方式在命令行的表示分別為:
- bpu
- bpafter
我們要改返回的腳本,所以也就是“請求之后”,則在命令行輸入 bpafter {url}:

在進入綁定頁面的時候,可以看到已經對該部分進行了攔截:

我們直接在響應中修改代碼,增加兩行alert用以判定函數失效的位置,修改完成后,直接點擊Run to Completion即可:

結果兩個alert都觸發了,那么問題出在哪呢,顯然就是weui.alert的問題了:

weui.alert方法是微信官方提供的js文件,而且我在本地運行,通過微信測試號進行測試時是ok的,客戶的公眾號正式上線之后,也測試是ok的,現在突然莫名其妙就不生效了,你說氣不氣?關鍵是我再次用測試號進行測試,還是有效的,就是在正式環境不行,我不懂,不知道是服務器環境問題,還是正式公眾號和測試公眾號有什么區別。所以這就是能在所謂真實線上環境調試才能盡可能減少bug的原因吧,謎,得燒香。
接下來其實可以繼續使用這個方法進行調試修改,為了介紹另一種方式,接下來的修改就采用自動攔截的方式,不過記得先清除之前的斷點攔截,輸入bpafter不帶url即可清除:


3、方法2:Fiddler自動攔截改響應
Fiddler可以設置規則,自動對符合條件的url請求進行攔截,並返回指定的響應。這意味着我們可以把內容直接寫在本地的一個文件里,自動攔截設置為返回該文件,所以我們每次調試代碼只需要修改本地文件即可,這樣一來:
- 環境仍然是真實的服務器環境
- 本地修改不會影響服務器的文件,也不會影響其他人的請求
- 本地可以修改存儲,比斷點修改調試要方便很多
先把代碼寫在本地的一個txt文件中,因為是作為響應返回,所以不能單純是文件內容,還應該加上響應頭,文件內容只是作為響應內容體:

接下來設置自動攔截響應:
- 找到AutoResponder頁面
- 點擊Add Rule添加攔截規則
- 編輯攔截規則,分別對應攔截的url和返回的響應內容
- 選擇啟用規則Enable rules

好了,接下來我們直接修改本地文件的內容。既然weui.alert在線上有問題,那么我們用它其他的api,比如weui.toast:

保存好文件,再次訪問頁面,可以看到fiddler的響應中,確實返回的是我們本地文件的內容:

發現weui.toast在線上可以正常運行:

那么調試ok以后,直接把服務器上的內容按調試后的代碼進行修改重新部署,就行了。
fiddler的兩種方式修改響應,是不是很方便呢?