whistle 是一個跨平臺的抓包與 web debug 工具,使用 whistle,你能夠配置代理服務器,模擬接口數據,捕獲請求重定向到指定 url,修改請求頭響應頭,修改 GET 請求的參數,往匹配的頁面中注入 js、csscss
whistle 提供了和 fiddler 相似的功能,也提供了一些 fiddler 沒有的功能,使用體驗比 fiddler 好不少,一開始公司組內只有我一我的用,通過安利,大部分開發、測試都換成了 whistle。並且 whistle 能夠在 windows、mac、linux 上運行,目前還在不斷迭代更新,維護者對社區的各類問題都能及時響應,是一個很優秀的工具。html
這篇文章接下來會介紹 whistle 的安裝及常見的使用方法,若是你要上手使用 whistle,建議通篇看完後嘗試安裝,遇到問題能夠看文末的參考資料或自行 google。前端
npm install -g whistle
(若是提示沒有權限,要以 admin 或 sudo 的方式運行)在 whistle 啓動完成後,咱們須要將瀏覽器的請求代理到 whistle,這樣 whistle 才能處理瀏覽器發出的請求。爲此,咱們須要安裝一個 SwitchyOmega chrome 擴展程序。node
example.com
改成 127.0.0.1
,將 80
改成 8899
咱們能夠爲某個域名或具體的 url 指定 ip,繞過 dns 解析,讓請求直接到達指定的 ip。一般在工做中,開發、測試和預發佈境的切換都經過切換 host 來實現,這樣訪問不一樣的環境不須要改變代碼,或根據環境配置文件訪問不一樣的 url。linux
whistle 的 host 在 rules 下配置:git
如下是經常使用的配 host 方法:github
將 qq.com 映射到 127.0.0.1,你訪問 www.qq.com/ 時,請求的是本地的 127.0.0.1web
127.0.0.1 qq.com
複製代碼
你也能夠把端口帶上ajax
127.0.0.1:3000 qq.com
複製代碼
你甚至能夠將指定的路徑映射到某個 ip 和端口chrome
127.0.0.1:3000 https://www.qq.com/a/b/c
複製代碼
固然,把規則反過來寫也是生效的
https://www.qq.com/a/b/c 127.0.0.1:3000
複製代碼
除了配 host,whistle 還有其它強大的功能,咱們繼續往下看
https://www.baidu.com/ redirect://https://www.qq.com/
複製代碼
此規則在移動端調試時有個場景特別有用:好比想在某個 APP 裏打開一個的網頁,可是該 APP 沒有一個 url 輸入框,咱們能夠隨機地點擊這個 app 的信息流,若是捕獲到有頁面請求,重定向爲咱們的 url 便可。
該功能在後端接口掛了或者沒有開發好的時候,能夠模擬返回假數據,讓前端調試能夠不依賴後端
http://example.com/api/getUserList file://D:/path/to/your/file/userList.json
複製代碼
將 getUserList 這個請求的返回替換成本地的 userList.json 文件,若是以爲文件放在磁盤裏寫路徑麻煩,能夠放在 whistle 自帶的 Values 裏,那麼上面的規則就更簡潔了:
http://example.com/api/getUserList file://{userList.json}
複製代碼
Values 是個頗有用的功能,位置以下:
建立的文件儘可能帶文件後綴,有語法高亮,另外若是不是 .json 結尾,whistle 不會在 Response Headers 裏自動添加 content-type: application/json; charset=utf-8
,那麼一些請求庫就拿不到正確的返回。
若是有正式環境 bug,能夠將 js 替換成本地文件或文件夾,提升調試效率。
http://example.com/cdn/example.js file://D:/path/to/your/file/example.js
複製代碼
http://qq.com/a/b?c=d http://qq.com/v/w?x=y&z=z
複製代碼
注意:這個規則的修改在瀏覽器的 network 裏體現不出來,由於請求已經發出去,到 whistle 層才被修改的,咱們能夠在 whistle 的 Network 右側裏看到 Real Url
經過修改返回碼,能夠模擬接口出錯
https://www.qq.com statusCode://500
複製代碼
Web 開發有時會遇到請求 header 設置不對帶來的一些問題,若是問題出如今正式環境,咱們能夠經過修改請求 header (好比修改 Cookie、user-agent、Content-Type 等)來模擬修復,等確認問題後,再修改代碼,提升效率。
https://www.qq.com reqHeaders://{loginCookie}
複製代碼
一樣,咱們能夠經過 resHeaders 來修改響應頭,上文提到咱們能夠經過 file://{userList.json} 來模擬假數據,但這麼作可能致使一些跨域的 header 丟失,對此,咱們能夠經過 resHeaders 加上跨域相關 header
https://www.qq.com/some/ajax resHeaders://{CORSHeaders}
複製代碼
Values 中的 CORSHeaders 值爲
Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, token
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
content-type: application/json
status: 200
複製代碼
咱們能夠在不修改頁面代碼的狀況下,經過 whistle 往頁面插入 js,好比咱們插入一個使頁面刷新的 js:
https://www.google.com jsPrepend://{reload.js}
複製代碼
更有用的,是往頁面中插入調試相關的 js,好比 vConsole.js,咱們固然能夠到 github 上將 vConsole.min.js 下載到本地,或放在 Values 中,而後把初始化代碼也加上,最後將 vConsole.js 注入到頁面來 debug。不過,whistle 提供了更方便的插件:
npm i -g whistle.inspect
複製代碼
https://www.google.com whistle.inspect://
複製代碼
考慮一種場景:咱們要測一個視頻上傳接口返回 500 的狀況,看是否走到了正常的提示邏輯,一般咱們模擬狀態碼就能夠解決,但若是接口跨域了,會先發起一個路徑一致的 options 請求,咱們但願這個 options 請求依然返回 200,只處理 post 請求,這時咱們能夠這麼作:
http://qq.com/media/video reqScript://{onlyPostRule}
複製代碼
Values 中的 onlyPostRule:
if (method === 'POST') {
rules.push('http://qq.com/media/video statusCode://500');
}
複製代碼
抓取 https 請求須要安裝證書,官網文檔 已經很詳細了,這裏就再也不贅述,不過有兩點要補充說明:
咱們能夠將電腦、手機連在同一個局域網下 (通常連同一個 wifi 就能夠,公司有網絡策略限制得再想辦法),而後點擊 whistle 界面右上角的 Online
手機上進入 wifi 設置,代理設爲手動,主機名填圈出來的 ipv4 ip,端口填 whistle 默認的 8899:
這麼操做後,咱們就能夠抓到手機上的請求了。
關於 whistle 就介紹到這裏,若有疑問或任何想法,歡迎你們評論。
參考資料: