Charles是Mac平台上一款优秀的抓包工具,基本可以满足我们日常工作中对于接口抓包、mock数据、模拟弱网、设置代理等常见需求。下面就为大家介绍一下,平时工作中可能会用到的一些功能。
证书配置
Charles安装完成后,首先需要为电脑安装Charles的证书,根据提示将证书添加到本地钥匙串中,操作路径如下:
Help -> SSL Proxying ->Install Charles Root Certificate
![](https://tech.qimao.com/content/images/2021/11/image.png)
证书添加完成后,需要打开Charles的https抓取,操作步骤如下:
![打开SSL代理设置](https://tech.qimao.com/content/images/2021/11/image-1.png)
![](https://tech.qimao.com/content/images/2021/11/image-2.png)
![](https://tech.qimao.com/content/images/2021/11/image-3.png)
保存之后,Charles就可以正常捕获https的接口请求了,如果需要抓取本地电脑发起的请求,则需要勾选如下配置:
![](https://tech.qimao.com/content/images/2021/11/image-4.png)
如果需要通过Charles抓取移动端的请求,那需要在移动设备上安装Charles的证书。手机和电脑连接到同一个网络下,wifi代理设置成电脑的IP,端口默认是8888。电脑的IP可以通过查看本机IP地址:Help -> Local IP Addresses 获取。
然后打开手机浏览器,访问chls.pro/ssl,下载并安装证书。(注意如果是iOS10及以上系统,安装完成后需要到通用-关于手机-证书信任设置,开启刚刚安装的证书)。
完成以上步骤后,就可以正常开启抓包了~
操作界面介绍
Charles主要包含2个界面:Structure 视图将网络请求按访问的域名分类。Sequence 视图将网络请求按访问的时间排序。下面主要介绍一下Sequence视图下的一些界面。
Sequence主要分为上下两层,上层为捕获到的接口,下层为接口具体的一些信息,比如header、请求参数、响应结果等。
右击Sequence视图下的表头,可以打开所有可以选择的表头,推荐大家可以把Remote IP放出来,平时可以通过IP来区分访问的环境。
![](https://tech.qimao.com/content/images/2021/11/image-8.png)
下面是操作界面一些按钮功能:
![](https://tech.qimao.com/content/images/2021/11/image-10.png)
![](https://tech.qimao.com/content/images/2021/11/image-13.png)
常用功能介绍
1、DNS Spoofing
平常我们会使用到代理,通过修改本地hosts来绑定指定域名的服务器。但是有时候会出现这种情况,同一个域名电脑和手机希望访问不同的服务器。那我们通过Charles的DNS Spoofing就可以实现。我们可以通过在DNS Spoofing里添加域名绑定,来使通过走Charles代理的移动设备走DNS Spoofing里设置的host,而不是走电脑本地的host。功能路径如下:Tools -> DNS Spoofing,添加方法如下:
1)打开设置页面后,勾选Enable DNS Spoofing
![](https://tech.qimao.com/content/images/2021/12/image-18.png)
2)点击Add,添加host绑定
![](https://tech.qimao.com/content/images/2021/12/image-19.png)
![](https://tech.qimao.com/content/images/2021/12/image-17.png)
3)点击右下角OK,保存后该条规则立即生效。
这样,通过Charles访问该域名接口就会根据DNS Spoofing配置的IP和域名映射关系去请求对应的服务器。
Ps:注意如果多个域名添加了多个不同IP,同时勾选时,只有第一个会生效,并且在DNS Spoofing启用对应域名后,本地电脑的host绑定就不会生效了。
2、Map Local
我们经常会遇到这种场景,有时候接口还没开发完,但是客户端先做完了,这时候接口无法提供数据,那我们就需要通过本地mock数据的形式来提前测试客户端的功能。这个时候,我们就可以利用Charles的Map Local功能来提前测试。具体操作步骤如下:
1)打开Tools -> Map Local
2)勾选Enable Map Local,点击Add,添加新规则,Map From为需要mock的接口信息,Map To 则是本地数据来源(可以选择本地的json文件)
![](https://tech.qimao.com/content/images/2021/11/image-15.png)
3)点击OK后,匹配规则生效,下次Charles捕获到对应接口时会自动将本地文件内的数据通过接口返回。这样我们就可以很方便的通过修改本地Json里的数据来进行Mock。
3、Breakpoint(断点调试)
断点调试也是Charles里经常会用到的一个功能,Charles可以通过Breakpoint来拦截接口请求以及响应,方便我们修改请求参数的传参和响应的返回值。通过Breakpoint拦截请求,在请求发出去之前新增/修改/删除请求中的传参的字段或者值,也可以修改header里的参数,可以测试接口在不同传参下的结果。也可以通过Breakpoint拦截请求的响应,在响应返回给客户端前,修改返回数据,可以测试客户端在不同响应下的逻辑,不必去构造复杂的服务端数据。
1)功能入口
![](https://tech.qimao.com/content/images/2021/12/image-20.png)
2)勾选Enable Breakpoints,启用断点调试功能。
![](https://tech.qimao.com/content/images/2021/12/image-21.png)
3)点击Add,新增断点调试匹配规则,其中Host是需要拦截的接口域名,Path是接口路由,Query是接口请求参数。下面Request和Response的勾选代表想要拦截的类型,Request代表在请求发送前拦截,Response代表在请求响应返回后拦截。
![](https://tech.qimao.com/content/images/2021/12/image-22.png)
4)点击OK保存后,断点规则就会生效,当下次Charles捕获到相同请求时就会根据选择的拦截规则进行拦截。
除了上述添加方式以外,还有一种快捷添加断点的方法。我们可以在捕获到的接口列表中,选中想要断点的接口,右键,然后在菜单中选择Breakpoints,这样就会自动把这个接口加入断点拦截规则里。然后我们就可以直接在上述步骤2的列表中找到这条规则,再双击就可以直接编辑。推荐大家使用这种方式,更快更高效。
另外由于我们平常测试的接口经常有一些动态参数,会导致每次请求里参数的值会发生变化,这样就会导致我们完全按上一次请求的Query进行匹配时就会匹配失败。这种情况,我们可以把规则里的Query清空,这样Charles就会直接匹配Path部分,只有请求接口里包含相同的路由,就能匹配成功。
5)下面就是Charles拦截到的请求/响应,可以对请求参数/返回响应进行修改。
![](https://tech.qimao.com/content/images/2021/12/image-23.png)
![](https://tech.qimao.com/content/images/2021/12/image-24.png)
4、Throttle(弱网模拟)
在客户端的测试工作中,弱网情况也是我们经常需要测试的场景,通过模拟网络延迟,丢包等方式来检测客户端在网络不稳定时候的一些表现,是否有接口超时逻辑、重试机制等等。Charles为我们提供了一个强大的弱网模拟工具-Throttle,预置了一些网络类型,方便我们模拟不同网络状况。
![](https://tech.qimao.com/content/images/2021/12/image-25.png)
Throttle中一些参数说明:
Only for selected hosts
勾选后,只对添加的hosts做网速限制,其他的hosts还是正常网速访问
Throttle perset
提供几个预设的网络模拟场景
Bandwidth(带宽)【吞吐量】
带宽定义数据可以传送超过时间上限,这是千比特每秒指定。可以指定上载和下载链接的不同带宽限制。
Utilisation(利用)
利用率是总带宽的百分比,可以在任何一个时间使用。它只是作为可用带宽的缩放因子。对于大多数现代互联网连接利用率始终是100%。
Round-trip Latency(请求往返延迟)【延时】
往返延迟测量客户端和远程服务器之间的第一次往返通信的毫秒延迟。它用于客户端向服务器和服务器向客户端的每次请求。
MTU(最大传输单元)
在任何传输的TCP数据包的最大尺寸。指定MTU不改变的可用带宽,但允许Charles在MTU分配带宽大小的块,导致在每个传输包分割的现实水平。
Reliability(可靠性)【丢包】
可靠性是衡量连接完全失败的可能性。这是非常有用的模拟不可靠的网络条件。可靠性是指定为成功发射10kib消息的可能性,所以,值为50%意味着所有10kib传输一半会成功。较大的邮件或更小的消息或多或少都有可能失败,所以20kib传输将只有25%的成功率和5kib传输成功率约70%。
Stability(稳定性)【抖动】
稳定性是衡量一个连接的可能性是不稳定的,因此降低了质量。这是非常有用的模拟网络,如移动网络,定期连接质量差。如果连接不稳定,则连接的质量会在不稳定的质量范围内随机下降。此质量值,然后应用作为另一个缩放因子的可用带宽。
unstable quality range(不稳定质量范围)
此处设置主要针对于Stability中设置中的范围
5、Recording Setting
通常我们抓包都会有特定关注的对象,比如测APP的时候,我们只想看到我们APP内产生的接口请求,而不希望大量手机系统自己的接口请求或者其他APP产生的接口请求来干扰我们。这种情况下,我们可以通过设置Charles的捕获规则,来限制捕获我们想要的指定接口或者过滤掉不想要的接口。
1)比如我们只想要接收指定域名的接口请求时,就可以添加如下规则:
![](https://tech.qimao.com/content/images/2021/12/image-28.png)
![](https://tech.qimao.com/content/images/2021/12/image-29.png)
Include里有多条规则时,匹配到Include里的任意一条规则,这个接口就会被捕获,没有匹配到的接口则会被过滤。而Exclude就正好相反,Charles会直接过滤掉匹配到Exclude里规则的这部分接口请求。
6、Rewrite
相信大家平时遇到过这样的场景,比如测试接口返回异常的http code的情况,比如当接口404、500等情况下,客户端的一些容错机制。还比如,我们希望客户端发起的请求参数里的某个字段固定传某个值,但是每次通过BreakPoint断点修改请求参数又有点麻烦。这几种情况下,Charles的Rewrite工具就能很好的帮我们解决这些痛点。
1)功能入口如下:
![](https://tech.qimao.com/content/images/2021/12/image-30.png)
2)比如我们希望将固定接口返回值改成404,可以点击左下方Add,新增规则
![](https://tech.qimao.com/content/images/2021/12/image-31.png)
![](https://tech.qimao.com/content/images/2021/12/image-32.png)
![](https://tech.qimao.com/content/images/2021/12/image-34.png)
3)以上规则的含义就是将返回的状态码从200改成404。这样下次Charles捕获到接口时,如果满足了Rewrite里设置的匹配规则,就会自动执行后续操作,无需人工介入。Rewrite的功能很强大,可以执行的操作类型也很多,大家可以根据实际需要进行尝试。
![](https://tech.qimao.com/content/images/2021/12/image-35.png)
以上便是本次分享的全部内容,希望对大家有所帮助,谢谢~