前言
接口调试在我们应用的开发中必不可少,常用的接口调试方法有日志打印,拦截器打印,拦截器抓包,代理抓包的方式。
日志打印和拦截器的方式往往需要我们手动的更改代码或者在工程中依赖三方库,手动改动代码的方式比较麻烦,并且无法做到同时抓取多个包。
拦截器抓包的方式使得我们只能抓取指定应用的包。
当然还有在手机上安装apk抓包的方式,但是如果要实时的抓包的话需要频繁的切换应用。
鉴于以上,我们的工作方式通常是使用电脑和手机。如果我们可以在操作应用的时候可以实时的在电脑上抓包,那就方便多了。
下面,我来介绍一下使用PC端抓包工具来抓包的方法。
简介
比较著名的PC端抓包软件有Fiddler,Charles. 这两个都是比较常用的抓包软件。但是使用起来界面感受就比较一般了。
这里我用的是postman,用起来界面比较清晰,图形化界面使用起来更舒服一些。可以根据个人喜好使用抓包软件,操作类似。
具体抓包方法
根据几种常见的实际场景,我分别介绍抓包方式
电脑和手机连接同一个WiFi
前提:手机和电脑连接到同一个网络
- 打开postman的代理设置
如图所示
- 找到代理设置入口
- 设置代理的端口号,我这里设置为默认的5555
- 设置网络请求保持的文件夹,我这里设置为默认的history
- 打开监控开关“Capture Requests”
- 记住电脑的IP地址
- 我这里以mac电脑为例。连的是公司的wifi:iot-test,此时我的ip地址为:192.168.31.111
- 在手机端配置HTTP代理
- 打开手机,和电脑连接同一个wifi,前面我的电脑连的是iot-test,所以手机也是连的iot-test
- 设置“代理”中的主机名,这里的主机名就是上个步骤中电脑的ip地址:192.168.31.111
- 端口号设置为postman中设置的端口号,也就是5555
- 打开想要监听的手机应用
就能看到这个app发起的网络请求了。
选中其中一个,可以看到headers信息,(body如果有),这些都自动填充好了,点击“Send”可以再发起这次网络请求
- 过滤
上面这种方式可以抓到手机中的所有http请求,如果我们只想看到指定应用的网络请求的话,就可以在上面中指定url过滤。
这样就可以只看到我们想要的网络请求了。
电脑连接网线,手机连接电脑热点
有的时候,没有公共热点,电脑通过连接网线上网,手机连接电脑设置的热点。
- 查看电脑设置的热点的ip地址
- 这里我在电脑上设置的热点名为:youpppp
- 查看热点的ip地址
接下来的步骤和上一个场景相同,只是代理的中的主机名的ip地址改为当前WiFi的ip地址。
手机通过USB连接电脑,电脑通过网线连接网络
前面2个场景都需要我们的电脑有无线网卡,但是有的时候我们的电脑不具备无线网卡的时候该怎么抓包呢?
下面介绍Postman+gnirehtet+Proxifier的方法来抓包
我们可以想一下前面连接WiFi抓包的满足的条件是什么?
- 手机和电脑连接同一个WiFi,即在同一个网络下
- 手机通过设置电脑的ip地址进行代理,这样手机的网络请求就通过电脑进行转发
- 电脑端的抓包软件通过设置端口将请求转发和监听,从而实现捕获网络请求
那么要满足第一个条件,就有2种方式:
- 手机使用电脑的网络
- 电脑使用手机的网络
下面来介绍方式一:
手机使用电脑的网络
要想手机使用电脑的网络,那么步骤一就是关闭手机的网络
- 关闭手机的移动网络和WiFi连接
第二部是手机通过电脑来上网
- 安装Genymotion的开源软件:gnirehtet,运行gnirehtet-run.cmd
会在手机上安装一个无界面的软件,即客户端,以及电脑上的http服务端,通过USB连接之后,客户端就通过adb将网络请求发到服务端,服务端再通过自身的网络进行转发,最后将结果再通过adb反向传输到客户端。
做完这一步之后手机就可以上网了,手机的所有请求都是通过电脑进行发出的。
那么我们还需要满足条件三,即设置要转发和监听的端口号。
我们想要捕获的是gnirehtet所发出的所有请求,问题是gnirehtet是一个独立的客户端,如何让它的请求通过固定的端口转发呢?
- Proxifier
- 设置代理服务器
前提:这里设置的是http代理,Proxifier默认没有把http代理打开,这里需要先找到开关入口,将其打开。
打开之后,现在就能支持http代理了。
接下来,我们来设置http代理服务器。打开配置规则->代理服务器→新增:地址:127.0.0.1,端口:5555。
2.设置代理软件
将附件中的gnirehtet下载安装好之后,在上图的“应用程序”一栏设置代理的应用程序
3.设置代理规则
配置规则->代理规则->添加->应用程序:添加gnirehtet.exe,动作:ProxyHTTP 127.0.0.1
其他规则名称设置为直连,这样gnirehtet所有的请求都会通过端口5555进行转发,配置成功之后在手机打开浏览器就可以看到proxifier中显示的代理请求结果了
- 同场景1,设置postman的端口为5555
postman就会进行端口转发和监听了。
抓包结果如下:
软件资源下载
- postman下载地址www.getpostman.com/
- gnirehtet开源库:github.com/Genymobile/…
- PC端代理工具Proxifier
Proxifuer_setup_v3.31.zip 链接:pan.baidu.com/s/1PR6bl4gx… 提取码:srd1 gnirehtet-rust-win64-v2.1.zip 链接:pan.baidu.com/s/1TV-fkjn6… 提取码:b0yl
思考
上面介绍的方式只能监听到http的请求,监听https请求需要添加信任证书,未添加证书的时候是无法抓到https请求的。
当然postman也支持添加证书,理论上也可以抓取https请求。
场景3中我只试了方法一,方法二应该也可以,有兴趣的读者可以自己去尝试哈
其他
adb通信原理:cloud.tencent.com/developer/a…
利用抓包方式可以很方便的提高开发人员在调试网络请求的效率和在网络请求失败时快速分析和调试,甚至测试人员在测试应用的时候发现异常时也可以利用抓包的方式快速的分析是服务的的问题还是应用端的问题,提高解决问题的效率