一、前言
在日常开发遇到需要做手机端测试
、调试第三方的sdk包
或者浏览器调试接口发现f12被限制
等等情况下,我们可以选用fiddler
、wireshark
、charles
等抓包工具来抓取对应的请求-响应信息
(接口请求方式、接口请求URL、接口请求参数、接口返回参数等)。
附言:本文介绍的是 fiddler,其他抓包工具请查阅其他资料,还有github上有很多开源的抓包工具可以自行去查找使用。
二、fiddler官网下载
百度搜索fiddler
找到官网,导航栏找到fiddler tools
一栏,选择并点击fiddler classic
跳转到下载页面,点击download now
下载。
附言:新版的fiddler everywhere已经从免费改为一个月试用了,试用起来体验像 postman,可惜收费了只能转向免费的fiddler classic
了。
三、fiddler设置
1. 设置解码https请求
- 打开菜单栏:Tools>Options...>HTTPS
- 勾选如下的项。
2. 安装证书
证书安装完后,我们可以去windows证书管理里面查看下证书,如下图。
可见证书名称:【DO_NOT_TRUST_FiddlerRoot】。
如果是 firefox 还要导出证书(export root certificate to desktop)到 firefox 浏览器上安装。
注意:fiddler 更新可能导致证书失效,失效表现就是正常的浏览器请求都失败了,关闭 Capturing 后恢复正常。这个时候可以点击 Actions 》Reset All Certificates,移除证书,移除后会提示重新安装。安装好后,可以正常 Capturing 了。
3. 手机端抓包设置——允许远程连接 (手机抓包必须设置)
fiddler默认端口是8888,可以把它设置成任意端口。勾选Allow remote computers to connect
允许远程连接。
三、PC抓包
按fiddler设置
操作完,就可以正常抓包了,操作也比较简单不赘述了。
有一点要注意的是我对接第三方 api 接口的时候遇到的,java 请求远程的api,fidder不能正常抓取的。这边的方案是 main 方法里设置http代理端口,如下图。端口可以在 Tools>Options...>Connections 里面查看到。
1. jdk.net包的 HttpURLConnection 可以用以下方案(走系统代理)
// 设置系统代理端口
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyPort", "8888");
2. apache 的 httpClient默认不走系统代理
需要另外设置代理,如下图代码
// 详细请看另一篇文章【java设置代理】
HttpHost proxy = new HttpHost("127.0.0.1", 8888, "HTTP");
// 1. 设置sslContext,用于https请求 2. 设置代理
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLContext(createIgnoreVerifySSL())
.setProxy(proxy)
.build();
四、手机抓包
按fiddler设置
操作完,我们还需要在手机 wifi 上设置代理,代理到电脑ip
相应的fiddler的端口(8888)
。注意:必须要 wifi 因为要局域网内连接到电脑的 fiddler 上。
1. 查看电脑ip
fiddler classic
右上角的Online
鼠标放上去可以看到 pc 局域网内 ipv4 的地址;或者 cmd 命令行下,使用ipconfig
可以查看到ip地址。
2. fiddler监听的端口
前面已经多次提及了。
3. wifi设置代理
进入已经连接的wifi设置,我的红米手机可以看到代理
选项(默认无),选择手动
,如下截图设置。其他手机可能要点什么显示高级选项
之类的选项设置。
4. 安装证书
- 如果请求都是 http 请求是不用安装证书的,如果是 https 请求,这时候就要下载证书了。
- 手机浏览器打开:本机ip:端口,本机ip请填前面
查看电脑ip
获取的 ip,端口是 fiddler 监听端口。比如我的是:192.168.0.100:8888。 - 访问链接打开网址后找到
FiddlerRoot certificate
,点击下载,下载后点击安装证书就可以了。
至此手机抓包配置完毕。
五、常用功能
1. 断点(breakpoint,bp)
主要有两种类型:before requests
—— 请求到服务器前拦截;after responses
—— 响应到用户前拦截。
1.1 先介绍全局断点:
全局断点表示全部请求都拦截,只是区分拦截请求前还是请求后。设置如下图。
操作完,记得关闭全局断点:Rules>Automatic Breakpoints>Disabled
1.2 自定义断点(比如我只想拦截localhost:8080的请求)
- bpu (breakpoint url):拦截指定的url。如
bpu localhost:8080
,如下图。取消断点,在命令行输入: bpu 回车。
- bpafter:拦截指定url响应。如
bpafter localhost:8080
。基本同bpu
。 - bps(status):在特定http状态码时中断。如
bps 404
。bps 202
其实就是针对状态码是200的请求设置bpafter
拦截。 - bpm、bpv(method):针对请求的方法(get、post)拦截。如
bpm get
。其实就是根据请求的类型(方法)设置bpu
拦截。
2. 会话保存
这个十分实用。比如你要对接第三方的接口,但是接口调试不通,原因怎么也找不到。这种情况问题的原因可能会有多种:可能是发送的参数类型错了、可能是第三方加密密钥给错了、可能是第三方内部没有配置好等等。
我们可以通过 fiddler 保存请求报文到桌面,然后发给第三方对接的人员来查找问题。这样可以极大降低沟通的成本,因为可以同时看到请求和响应的数据,第一时间可以确定是请求方的问题还是响应方的问题。
操作如下图。File>Save>Selected Sessions>as Text...
3. 过滤请求(我只想看特定host的请求)
Filters 设置过滤指定的hosts,这样我们就可以专注于我们想要看的请求,如下图。
题外话 —— http协议简介
什么是http
- 1、HTTP协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
- 2、HTTP(HyperText Transfer Protocol)协议是基于TCP的应用层协议,它不关心数据传输的细节,主要是用来规定客户端和服务端的数据传输格式,最初是用来向客户端传输HTML页面的内容。默认端口是80。
- 3、http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议。