多數資料摘抄至 https://www.cnblogs.com/miantest/p/7289694.html
一、在 macOS 下如何安裝 (https://www.telerik.com/fiddler)
首先,Mac下需要使用.Net編譯后的程序,需要用到跨平台的方案Mono(現階段微軟已推出跨平台的方案.Net Core,不過暫時只支持控制台程序)。安裝程序可以從http://www.mono-project.com/download/#download-mac地址下載。
安裝完后,在Terminal里執行以下命令:1、/Library/Frameworks/Mono.framework/Versions/5.16.0/bin/mozroots --import --sync ⚠️ 5.16.0 的地方寫對應的 Mono.framework 版本
此步是為了從Mozilla LXR上下載所有受信任的root證書,存於Mono的證書庫里。root證書能用於請求https地址。
2、接下來如果想要運行Fiddler,還需要把Mono加入到環境變量中。編輯.bash_profile文件:
sudo vi ~/.bash_profile
加入文本
export MONO_HOME=/Library/Frameworks/Mono.framework/Versions/5.0.1
export PATH=$PATH:$MONO_HOME/bin
⚠️ 5.0.1 改成自己的 Mono.framework 版本
保存后重新打開Terminal,Mono環境已裝好。
3、Fiddler的安裝
從Fiddler官網https://www.telerik.com/download/fiddler下載fiddler-mac.zip的壓縮包。解壓到非中文字符的路徑下。
Fiddler運行,先 cd 到 Fiddler 的路徑下面
打開Terminal,進入到剛才解壓的Fiddler路徑,執行命令運行:
sudo mono Fiddler.exe
如果報錯的話就用 mono --arch=32 Fiddler.exe 這個命令
二、Fiddler 基礎?(多數資料摘抄至 https://www.cnblogs.com/wangning528/p/6388464.html)
Fiddler 是啥:Fiddler 是位於客戶端和服務器端的 HTTP 代理,目前最常用的 HTTP 抓包工具,能夠記錄客戶端和服務器端的所有 HTTP 請求,可以針對特定的 HTTP 請求,分析請求數據、設置斷點、調試 web 應用,修改請求的數據,甚至可以修改服務器返回的數據,功能非常強大,是 web 調試的利器。
學習的前提,必須懂 HTTP 相關知識:
1、了解 web 及 網絡基礎
HTTP
a :超文本傳輸協議,是一種通信協議,它允許將文本標記語言(html)文檔從 web 服務器傳送到客戶端的瀏覽器,是一個應用層協議,由請求和響應構成,HTTP 是一個無狀態的協議(同一個客戶端這次請求和上次請求是沒有對應關系的)。(網絡協議:網絡中數據交換而建立的規則,因為兩個數據終端所用字符集不同,所以要用協議讓它們轉化成另一個客戶端認識的)

b : HTTP 的端口號為 80, HTTPS 的端口號為 443 (端口號:當一台電腦啟動了一個讓遠程電腦訪問的程序,那么它就需要開啟至少一個端口號來讓外界訪問,所以當一個系統開啟了一個可以讓外界訪問的程序后自然需要在房間上開一個窗口來接受外界的訪問,這個窗口就是端口,那為什么要給端口編號來區分它們呢?既然一個程序開了一個端口,那么不是外部信息都可以通過這個開啟的端口來訪問了嗎?答案是不可以,因為數據是端口號來通知傳輸協議送給哪個軟件來處理的,數據是沒有智慧的,如果很多程序共用一個端口來接受程序的話,那么外界的一個數據包送來的傳輸層就不知道該送給哪個軟件來處理,這樣勢必會混亂。摘抄至:https://blog.csdn.net/flying_man_/article/details/79392923)
c :工作流程
一次 HTTP 操作稱為一個事務
1) 客戶機和服務器需要建立連接,只要單擊某個超級鏈接,HTTP 開始工作。
2) 建立連接后,客戶機發送一個請求給服務器,請求方式的格式為:統一資源標識符(URL)、協議版本號,MIME 信息包括請求修飾符、客戶機信息和可能的內容。
3) 服務器接收請求后,給予相應的相應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或者錯誤的代碼,后面是 MIME 信息包括服務器信息、實體信息和可能的內容
4)客戶端接收服務器所返回的信息通過瀏覽器顯示在用戶的顯示屏桑,然后客戶機與服務器斷開鏈接。
如果以上過程中的某一步出現錯誤,那么產生錯誤的信息將返回到客戶端,有顯示屏輸出,對於用戶來說,這個過程是由 HTTP 自己完成的,用戶只需要鼠標點擊,等待信息顯示就 OK 了。
三、了解 Fiddler 各個字段的含義(多數資料摘抄至 https://www.cnblogs.com/miantest/p/7289694.html) 如何抓取瀏覽器的 數據包?

#:順序號,按照抓包的順序從1遞增
Result:HTTP狀態碼 ( 200 :一切 OK ;500("Bad Request”); 502("Bad Gateway"))
Protocol:請求使用的協議,如HTTP/HTTPS/FTP等(HTTPS簡略講是HTTP的安全版)
HOST:請求地址的主機名或域名(比如我要登錄百度,然后請求的主機名就是 www.baidu.com)
URL:請求資源的位置
Body:請求大小
Caching:請求的緩存過期時間或者緩存控制值
Content-Type:請求響應的類型
Process:發送此請求的進程ID
Comments:備注
Custom:自定義值
3)每個Fiddler抓取到的數據包都會在該列表中展示,點擊具體的一條數據包可以在右側菜單點擊Insepector查看詳細內容。主要分為請求(即客戶端發出的數據)和響應(服務器返回的數據)兩部分。

4)HTTP Request Header:以百度為例,查看請求百度主頁這條數據包的請求數據,從上面的Headers中可以看到如下內容:

請求方式:GET
協議: HTTP/1.1
Client 頭域:
Accept: text/html, application/xhtml+xml, image/jxr, */* ---------瀏覽器端可以接受的媒體類型
Accept-Encoding: gzip, deflate ---------壓縮方法
Accept-Language: zh-CN ---------語言類型
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 ---------客戶端使用的操作系統和瀏覽器的名稱和版本
COOKIE頭域:將cookie值發送給服務器(web 服務器通過發送一個稱為 Set-Cookie 的 HTTP 消息頭來創建一個 cookie,然后存儲在用戶電腦上,在隨后的請求中將這些信息發送至服務器,web 服務器就可以使用這些信息來識別不同用戶。)
Transport 頭域:
Connection:當網頁打開完成后,客戶端和服務器之間用於傳輸HTTP數據的TCP連接是否關閉。keep-alive表示不會關閉,客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接;close表示關閉,客戶端再次訪問這個服務器上的網頁,需要重新建立連接。
HOST:主機名或域名,若沒有指定端口,表示使用默認端口80.
5)HTTP Response Header:繼續以百度為例,如圖所示:

協議:HTTP/1.1
狀態碼:200
Cache頭域:
Cache-Control: private ---------此響應消息不能被共享緩存處理,對於其他用戶的請求無效
Date: Sat, 05 Aug 2017 04:37:43 GMT ---------生成消息的具體時間和日期
Expires: Sat, 05 Aug 2017 04:37:42 GMT ---------瀏覽器會在指定過期時間內使用本地緩存
Cookie/Login 頭域:
Set-Cookie: BDSVRTM=264; path=/ ---------把cookie發送到客戶端
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=1425_21097_22157; path=/; domain=.baidu.com
Entity頭域
Content-Length: 202740 ---------正文長度
Content-Type: text/html;charset=utf-8 ---------告知客戶端服務器本身響應的對象的類型和字符集
Miscellaneous 頭域:
Bdpagetype: 2
Bdqid: 0x99791efd00036253
Bduserid: 2577220064
Server: BWS/1.1 ---------指明HTTP服務器的軟件信息
X-Ua-Compatible: IE=Edge,chrome=1
Security頭域:
Strict-Transport-Security: max-age=172800 ---------基於安全考慮而需要發送的參數,關於這個參數的解釋,請參考:http://www.freebuf.com/articles/web/66827.html
Transport頭域:
Connection: Keep-Alive
6)TextView:顯示請求或響應的數據。
7)WebForms:請求部分以表單形式顯示所有的請求參數和參數值;響應部分與TextView內容是一樣的。
8)Auth:顯示認證信息,如Authorization
9)Cookies:顯示所有cookies
10)Raw:顯示Headers和Body數據
11)JSON:若請求或響應數據是json格式,以json形式顯示請求或響應內容
12)XML:若請求或響應數據是xml格式,以xml形式顯示請求或響應內容
13)上面是以百度主頁為例,百度主頁采用的是GET請求,在TextView中沒有請求body,我們再以無憂行網站登錄接口為例,它是一個POST請求,除了請求頭外,在TextView中多了請求數據。這也是GET請求和POST請求的一個區別。GET請求是將請求參數放在url中,而POST請求一般是將請求參數放在請求body中。

總結:通過Fiddler可以抓取請求和響應參數,通過對參數進行分析,可以定位是前端還是后台問題。例如我們在測試登錄接口時,輸入了正確的手機號和密碼,但前端提示“請輸入正確的用戶名和密碼”;僅僅通過界面提示我們只能描述bug表象,但不能分析出問題原因。假設通過抓包我們發現是由於前端參數名錯誤或參數值為空,從而導致后台報錯。這個時候我們將bug指向前端開發人員,並將參數數據和接口文檔中對應的報文數據作為附件上傳,是不是可以提高bug的解決效率呢?Fiddler在實際的功能測試中有很大的作用,一方面幫助我們更好的了解某個業務中客戶端和服務器端是通過哪些接口進行請求的,從而更好的了解代碼邏輯;另一方面,我們還可以通過響應數據判斷哪里出現了問題,例如可能服務器程序掛了,導致前端報“服務器故障”,這時我們通過抓包發現響應數據返回502,這時我們可以手動去重啟服務或是聯系運維重啟服務,從而提高問題的解決效率。(可以根據返回響應數據是多少 (502、500 什么的,推測是什么 bug)
四、如何抓取手機 APP 的數據包(https://www.cnblogs.com/miantest/p/7290176.html),我用自己的 Apple 手機,沒有成功,我懷疑是因為 macOS 安裝 Fiddler 的問題,因為我設置 Fiddler 的 option ,設置以后要重啟,但是沒有重啟后我的設置數據就還原了。
