简介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 功能将网络请求截获并修改过程当中,整个网络请求的计时并不会暂停,因此长时间的暂停可能致使客户端的请求超时。