簡介html
Charles 是在 Mac、Linux 或 Windows 下經常使用的 http 協議網絡包截取工具,在日常的測試與調式過程當中,掌握此工具就基本能夠不用其餘抓包工具了。Charles 經過將本身設置成系統的網絡訪問代理服務器,使得全部的網絡訪問請求都經過它來完成,從而實現了網絡封包的截取和分析。除了在作移動開發中調試端口外,Charles 也能夠用於分析第三方應用的通信協議。配合 Charles 的 SSL 功能,Charles 還能夠分析 Https 協議。ios
Charles 是收費軟件,能夠免費試用 30 天。試用期事後,未付費的用戶仍然能夠繼續使用,可是每次使用時間不能超過 30 分鐘,而且啓動時將會有 10 秒種的延時。所以,該付費方案對廣大用戶仍是至關友好的,即便你長期不付費,也能使用完整的軟件功能。只是當你須要長時間進行封包調試時,會由於 Charles 強制關閉而遇到影響。後端
經過 Charles 軟件,咱們能夠很方便地在平常開發中,截取和調試網絡請求內容,分析封包協議以及模擬慢速網絡。用好 Charles 能夠極大的方便咱們對於帶有網絡請求的 App 的開發和調試。瀏覽器
Charles 主要的功能包括:服務器
官網下載地址網絡
其它下載地址併發
以前提到,Charles 是經過將本身設置成代理服務器來完成封包截取的,因此使用 Charles 的第一步是將其設置成系統的代理服務器。iphone
啓動 Charles 後,第一次 Charles 會請求你給它設置系統代理的權限。你能夠輸入登陸密碼授予 Charles 該權限。你也能夠忽略該請求,而後在須要將 Charles 設置成系統代理時,選擇菜單中的 Proxy => Mac OS X Proxy 來將 Charles 設置成系統代理。以後,你就能夠看到源源不斷的網絡請求出如今 Charles 的界面中。工具
須要注意的是,Chrome 和 Firefox 瀏覽器默認並不使用系統的代理服務器設置,而 Charles 是經過將本身設置成代理服務器來完成封包截取的,因此在默認狀況下沒法截取 Chrome 和 Firefox 瀏覽器的網絡通信內容。若是你須要截取的話,在 Chrome 中設置成使用系統的代理服務器設置便可,或者直接將代理服務器設置成 127.0.0.1:8888 也可達到相同效果。測試
http 代理的原理
普通http請求過程
加入了Charles的HTTP代理的請求與響應過程
Charles 主要提供兩種查看封包的視圖,分別名爲 「Structure」 和 「Sequence」。
Sequence 視圖將網絡請求按訪問的時間排序。
你們能夠根據具體的須要在這兩種視圖以前來回切換。請求多了有些時候會看不過來,Charles 提供了一個簡單的 Filter 功能,能夠輸入關鍵字來快速篩選出 URL 中帶指定關鍵字的網絡請求。
對於某一個具體的網絡請求,你能夠查看其詳細的請求內容和響應內容。若是請求內容是 POST 的表單,Charles 會自動幫你將表單進行分項顯示。若是響應內容是 JSON 格式的,那麼 Charles 能夠自動幫你將 JSON 內容格式化,方便你查看。若是響應內容是圖片,那麼 Charles 能夠顯示出圖片的預覽。
一般狀況下,咱們須要對網絡請求進行過濾,只監控向指定目錄服務器上發送的請求。對於這種需求,如下幾種辦法:
一般狀況下,咱們使用方法一作一些臨時性的封包過濾,使用方法二作一些常常性的封包過濾。
1)方法一:在主界面的中部的 Filter 欄中填入須要過濾出來的關鍵字。例如咱們的服務器的地址是:http:// yuantiku.com , 那麼只須要在 Filter 欄中填入 yuantiku 便可。
2)方法二:在 Charles 的菜單欄選擇 Proxy => Recording Settings,而後選擇 Include 欄,選擇添加一個項目,而後填入須要監控的協議,主機地址,端口號。這樣就能夠只截取目標網站的封包了。
3)方法三:在想過濾的網絡請求上右擊,選擇 Focus,以後在 Filter 一欄勾選上 Focussed 一項。
Charles 一般用來截取本地上的網絡封包,可是當咱們須要時,咱們也能夠用來截取其它設備上的網絡請求。下面以 iPhone 爲例,講解如何進行相應操做。
1)Charles 上的設置
要截取 iPhone 上的網絡請求,咱們首先須要將 Charles 的代理功能打開。在 Charles 的菜單欄上選擇 Proxy => Proxy Settings,填入代理端口 8888,而且勾上 Enable transparent HTTP proxying 就完成了在 Charles 上的設置。
2)iPhone 上的設置
首先咱們須要獲取 Charles 運行所在電腦的 IP 地址,Charles 的頂部菜單的 Help => Local IP Address,便可在彈出的對話框中看到 IP 地址。
在 iPhone 的 設置 => 無線局域網 中,能夠看到當前鏈接的 wifi 名,經過點擊右邊的詳情鍵,能夠看到當前鏈接上的 wifi 的詳細信息,包括 IP 地址,子網掩碼等信息。在其最底部有「HTTP 代理」一項,咱們將其切換成手動,而後填上 Charles 運行所在的電腦的 IP,以及端口號 8888。
設置好以後,咱們打開 iPhone 上的任意須要網絡通信的程序,就能夠看到 Charles 彈出 iPhone 請求鏈接的確認菜單,點擊 Allow 便可完成設置。
1)安裝證書
若是你須要截取分析 Https 協議相關的內容。那麼須要安裝 Charles 的 CA 證書。具體步驟以下。
首先咱們須要在 Mac 電腦上安裝證書。點擊 Charles 的頂部菜單,選擇 Help => SSL Proxying => Install Charles Root Certificate,而後輸入系統的賬號密碼,便可在 KeyChain 看到添加好的證書。
須要注意的是,即便是安裝完證書以後,Charles 默認也並不截取 Https 網絡通信的信息,若是你想對截取某個網站上的全部 Https 網絡請求,能夠在該請求上右擊,選擇 SSL proxy,這樣,對於該 Host 的全部 SSL 請求能夠被截取到了。
2)截取移動設備中的 Https 通信信息
若是咱們須要在 iOS 或 Android 機器上截取 Https 協議的通信內容,還須要在手機上安裝相應的證書。點擊 Charles 的頂部菜單,選擇 Help => SSL Proxying => Install Charles Root Certificate on a Mobile Device or Remote Browser,而後就能夠看到 Charles 彈出的簡單的安裝教程。
按照咱們以前說的教程,在設備上設置好 Charles 爲代理後,在手機瀏覽器中訪問地址 http://charlesproxy.com/getssl 便可打開證書安裝的界面,安裝完證書後,就能夠截取手機上的 Https 通信內容了。不過一樣須要注意,默認狀況下 Charles 並不作截取,你還須要在要截取的網絡請求上右擊,選擇 SSL proxy 菜單項。
在作移動開發的時候,咱們經常須要模擬慢速網絡或者高延遲的網絡,以測試在移動網絡下,應用的表現是否正常。Charles 對此需求提供了很好的支持。
在 Charles 的菜單上,選擇 Proxy => Throttle Setting 項,在以後彈出的對話框中,咱們能夠勾選上 Enable Throttling,而且能夠設置 Throttle Preset 的類型。
若是咱們只想模擬指定網站的慢速網絡,能夠再勾選上圖中的 Only for selected hosts 項,而後在對話框的下半部分設置中增長指定的 hosts 項便可。
有些時候爲了調試服務器的接口,咱們須要反覆嘗試不一樣參數的網絡請求。Charles 能夠方便地提供網絡請求的修改和重發功能。只須要在以往的網絡請求上點擊右鍵,選擇 Edit,便可建立一個可編輯的網絡請求。
咱們能夠修改該請求的任何信息,包括 URL 地址、端口、參數等,以後點擊 Execute 便可發送該修改後的網絡請求。Charles 支持咱們屢次修改和發送該請求,這對於咱們和服務器端調試接口很是方便。
咱們可使用 Charles 的 Repeat 功能來簡單地測試服務器的併發處理能力,方法以下。
咱們在想打壓的網絡請求上(POST 或 GET 請求都可)右擊,而後選擇 Repeat Advanced 菜單項。
接着咱們就能夠在彈出的對話框中,選擇打壓的併發線程數以及打壓次數,肯定以後,便可開始打壓。
悄悄說一句,一些寫得很弱的投票網站,也能夠用這個辦法來快速投票。固然,也能夠拿 Charles 的 Repeat 功能給一些詐騙的釣魚網站喂垃圾數據。
有些時候咱們想讓服務器返回一些指定的內容,方便咱們調試一些特殊狀況。例如列表頁面爲空的狀況,數據異常的狀況,部分耗時的網絡請求超時的狀況等。若是沒有 Charles,要服務器配合構造相應的數據顯得會比較麻煩。這個時候,使用 Charles 相關的功能就能夠知足咱們的需求。
根據具體的需求,Charles 提供了 Map 功能、Rewrite 功能以及 Breakpoints 功能,均可以達到修改服務器返回內容的目的。這三者在功能上的差別是:
1)Map 功能
Charles 的 Map 功能分 Map Remote 和 Map Local 兩種,顧名思義,Map Remote 是將指定的網絡請求重定向到另外一個網址請求地址,Map Local 是將指定的網絡請求重定向到本地文件。
在 Charles 的菜單中,選擇 Tools => Map Remote 或 Map Local 便可進入到相應功能的設置頁面。
對於 Map Remote 功能,咱們須要分別填寫網絡重定向的源地址和目的地址,對於不須要限制的條件,能夠留空。下圖是一個示例,將全部 ytk1.yuanku.ws(測試服務器)的請求重定向到了 www.yuantiku.com(線上服務器)。
對於 Map Local 功能,咱們須要填寫的重定向的源地址和本地的目標文件。對於有一些複雜的網絡請求結果,咱們能夠先使用 Charles 提供的 Save Response… 功能,將請求結果保存到本地(以下圖所示),而後稍加修改,成爲咱們的目標映射文件。
下圖是一個示例,將一個指定的網絡請求經過 Map Local 功能映射到了本地的一個通過修改的文件中。
2)Rewrite 功能
Rewrite 功能功能適合對某一類網絡請求進行一些正則替換,以達到修改結果的目的。
例如,咱們的客戶端有一個 API 請求是得到用戶暱稱,而當前的暱稱是 「tangqiaoboy」
咱們想試着直接修改網絡返回值,將 tangqiaoboy 換成成 iosboy。因而咱們啓用 Rewrite 功能,而後設置以下的規則。
完成設置以後,咱們就能夠從 Charles 中看到,以後的 API 得到的暱稱被自動 Rewrite 成了 iosboy。
3)Breakpoints 功能
上面提供的 Rewrite 功能最適合作批量和長期的替換,可是不少時候,咱們只是想臨時修改一次網絡請求結果,這個時候,使用 Rewrite 功能雖然也能夠達到目的,可是過於麻煩,對於臨時性的修改,咱們最好使用 Breakpoints 功能。
Breakpoints 功能相似咱們在 Xcode 中設置的斷點同樣,當指定的網絡請求發生時,Charles 會截獲該請求,這個時候,咱們能夠在 Charles 中臨時修改網絡請求的返回內容。
下圖是臨時修改獲取用戶信息的 API,將用戶的暱稱進行了更改,修改完成後點擊 Execute 則可讓網絡請求繼續進行。
須要注意的是,使用 Breakpoints 功能將網絡請求截獲並修改過程當中,整個網絡請求的計時並不會暫停,因此長時間的暫停可能致使客戶端的請求超時。