Fiddler 完整使用指南


一、Fiddler 基础介绍

1.1 什么是 Fiddler

Fiddler 是一款由 Telerik 公司开发的 HTTP/HTTPS 抓包调试工具。它作为一个本地代理服务器运行,能够拦截、记录、分析和修改客户端(浏览器、App 等)与服务器之间的所有 HTTP/HTTPS 通信数据。

Fiddler 是目前最流行的 Web 调试工具之一,被广泛应用于:

  • 前端开发:调试接口请求、验证数据格式、模拟后端返回
  • 后端开发:检查请求参数、分析响应数据、排查接口问题
  • 测试工程师:接口测试、弱网模拟、篡改数据验证容错性
  • 运维人员:分析网络请求、排查性能瓶颈
  • 安全工程师:分析请求安全性、检测敏感数据泄露

1.2 Fiddler 的工作原理

┌──────────┐         ┌──────────────┐         ┌──────────┐
│  客户端   │ ──HTTP──▶│   Fiddler    │──HTTP──▶│  服务器   │
│ (浏览器)  │◀──HTTP──│  (本地代理)   │◀──HTTP──│ (WebAPI) │
└──────────┘         └──────────────┘         └──────────┘
                       监听端口:8888
                     记录所有请求/响应

Fiddler 启动后会将自身设置为系统 HTTP 代理(默认端口 8888),所有经过该代理的网络流量都会被 Fiddler 拦截和记录。用户可以在 Fiddler 中查看、分析、修改这些请求和响应数据。

1.3 Fiddler 版本说明

版本 说明
Fiddler Classic 经典版本,仅支持 Windows,功能最为完整
Fiddler Everywhere 跨平台版本(Windows/Mac/Linux),界面更现代,部分高级功能需付费
Fiddler Now Fiddler Everywhere 的免费精简版

本文主要以 Fiddler Classic 为基础进行讲解,大部分功能在 Fiddler Everywhere 中同样适用。

1.4 Fiddler vs 其他抓包工具

特性 Fiddler Charles Wireshark Chrome DevTools
平台 Windows 跨平台 跨平台 浏览器内
HTTPS 抓包
修改请求/响应
弱网模拟
Mock 服务
费用 免费/付费 付费 免费 免费
学习难度 中等 中等 较高 简单

二、Fiddler 安装

2.1 下载

  1. 访问 Telerik 官网:https://www.telerik.com/fiddler/fiddler-classic
  2. 选择 Fiddler Classic,点击 Free Download
  3. 填写简单的注册信息后即可下载安装包

也可以从国内镜像或软件管家下载,搜索 “Fiddler Classic” 即可。

2.2 安装步骤

  1. 双击下载好的 FiddlerSetup.exe 安装包
  2. 阅读并同意许可协议
  3. 选择安装路径(建议保持默认路径,或改为非中文路径)
  4. 点击 Install 开始安装
  5. 安装完成后点击 Close

2.3 首次启动配置

  1. 启动 Fiddler,首次启动会弹出配置向导

  2. HTTPS 抓包配置(重要):

    • 点击菜单栏 ToolsOptionsHTTPS
    • 勾选 Decrypt HTTPS traffic
    • 弹出证书安装提示,选择 是(Yes)
    • 系统会自动安装 Fiddler 根证书
      在这里插入图片描述
  3. 确认代理端口:

    • ToolsOptionsConnections
    • 默认端口为 8888,确保未被其他程序占用
    • 勾选 Allow remote computers to connect(如需抓取其他设备的请求)
      在这里插入图片描述

2.4 常见安装问题

问题 解决方案
无法安装证书 以管理员身份运行 Fiddler
HTTPS 页面报错 确认 Fiddler 根证书已安装并信任
无法联网 检查系统代理设置是否被修改,关闭 Fiddler 后会自动恢复
端口被占用 修改 Fiddler 监听端口,或关闭占用 8888 端口的程序

三、Fiddler 界面功能介绍

3.1 主界面布局

在这里插入图片描述

3.2 菜单栏功能

File(文件菜单)
功能 说明
Capture Traffic 开启/关闭抓包开关(快捷键 F12)
New Session 清空当前会话列表,开始新的抓包
Open Session 打开已保存的 .saz 会话文件
Save 保存当前会话到 .saz 文件
Exit 退出 Fiddler
Edit(编辑菜单)
功能 说明
Copy 复制选中的会话信息
Remove 删除选中的会话(也可用 Delete 键)
Select All 全选所有会话(Ctrl+A)
Find Sessions 查找包含特定内容的会话
Rules(规则菜单)
功能 说明
Hide Connects 隐藏 CONNECT 隧道请求
Hide Image Requests 隐藏图片请求
Hide HTTPS Connects 隐藏 HTTPS 连接建立请求
Hide 304s 隐藏 304 缓存响应
Automatic Breakpoints 设置自动断点(Before Requests / After Responses)
Customize Rules 打开 FiddlerScript 编辑器,自定义规则
View(视图菜单)
功能 说明
Statistical 显示请求统计信息
Timeline 显示请求时间线视图
Composer 请求构造器,手动构建并发送请求
Tools(工具菜单)
功能 说明
Options Fiddler 全局设置(HTTPS、Connections、Gateway 等)
WinINET Options 打开系统 Internet 属性设置
TextWizard 编码/解码工具(URL Encode、Base64 等)
ASP.NET Viewer 查看 ASP.NET 视图状态

3.3 工具栏常用按钮

按钮 功能 说明
WinConfig Windows App 代理配置 允许 UWP/WinStore 应用流量通过 Fiddler
Capture 抓包开关 开启/关闭流量捕获(等同 F12)
Any Process 选择进程 拖动靶心图标到目标进程窗口,只抓取该进程的流量
Find 搜索 在所有会话中搜索关键字(Ctrl+F)
Decode 解码响应 自动解压 GZIP/DEFLECT 等压缩的响应体
Keep: All sessions 会话保留策略 设置保留会话数量,防止内存溢出
Clear Cache 清除缓存 清除 WinINET 缓存
Stream 流模式 开启/关闭流式传输模式
Buffer 缓冲模式 在缓冲模式下,Fiddler 会等待完整响应再转发

3.4 会话列表各列含义

列名 说明
# 会话序号
Result HTTP 状态码(200=成功,404=未找到,500=服务器错误等)
Protocol 协议类型(HTTP、HTTPS)
Host 请求的目标主机名
URL 请求的完整 URL 路径
Body 响应体大小(字节)
Caching 缓存控制头信息
Content-Type 响应内容类型(text/html、application/json 等)
Process 发起请求的本地进程名称和 PID
Comments 注释信息

点击列标题可以对该列进行排序,右键列标题可以选择显示/隐藏哪些列。

3.5 右侧面板(Inspectors 详解)

右侧面板分为上下两部分:请求区(上半部分)和响应区(下半部分)。

请求面板(Request Inspectors)
Tab 说明
Headers 以树形结构展示请求头信息(Method、URL、Cookie 等)
TextView 以文本形式展示请求体内容
Raw 展示原始的请求报文(包含请求行、请求头、请求体)
HexView 以十六进制形式展示请求数据
WebForms 以表单形式展示 URL 参数和 POST 表单数据
JSON 以树形结构展示 JSON 格式的请求体
XML 以树形结构展示 XML 格式的请求体
响应面板(Response Inspectors)
Tab 说明
Headers 以树形结构展示响应头信息
TextView 以文本形式展示响应体内容(可直接阅读)
Raw 展示原始的响应报文
HexView 以十六进制形式展示响应数据
ImageView 如果是图片类型,直接显示图片
JSON 以树形结构展示 JSON 格式的响应体
Auth 展示认证相关信息
Caching 展示缓存相关信息
Cookies 展示请求和响应中的 Cookie 信息

四、抓取 HTTPS 请求

4.1 开启 HTTPS 抓包

方法一:通过菜单设置

  1. 点击菜单 ToolsOptionsHTTPS
  2. 勾选 Decrypt HTTPS traffic
  3. 点击 ActionsTrust Root Certificate
  4. 系统弹出安全警告,一路选择 是 / 确定
  5. 重启 Fiddler 使配置生效

方法二:快速开启

  1. 点击底部状态栏的 HTTPS 文字(如果显示为灰色则未开启)
  2. 点击后变为蓝色即表示 HTTPS 抓包已开启

4.2 安装 Fiddler 根证书

Fiddler 需要安装自己的根证书才能解密 HTTPS 流量。步骤如下:

  1. 打开 Fiddler,ToolsOptionsHTTPS
  2. 点击 ActionsExport Root Certificate to Desktop
  3. 在桌面找到导出的证书文件,双击打开
  4. 点击 安装证书 → 选择 当前用户 → 下一步
  5. 选择 将所有的证书放入下列存储 → 浏览 → 选择 受信任的根证书颁发机构
  6. 点击下一步 → 完成
    在这里插入图片描述

4.3 验证 HTTPS 抓包是否成功

  1. 打开浏览器访问 https://www.baidu.com
  2. 在 Fiddler 会话列表中查看是否有对应的 HTTPS 请求
  3. 点击该会话,在右侧 Inspectors 中查看响应内容

4.4 HTTPS 抓包失败排查

问题 原因 解决方案
页面显示 “您的连接不是私密连接” 根证书未正确安装 重新导出并安装根证书
Fiddler 中看不到 HTTPS 请求 HTTPS 解密未开启 确认 Decrypt HTTPS traffic 已勾选
某些 App 无法抓包 App 使用了证书固定(SSL Pinning) 需要对 App 进行处理或使用其他工具
Fiddler 证书被系统拒绝 Windows 更新后证书失效 删除旧证书,重新导出安装

4.5 注意事项

  • 安全警告:Fiddler 解密 HTTPS 时相当于中间人代理,所有数据以明文形式展示。抓包结束后建议关闭 HTTPS 解密功能。
  • 证书冲突:如果同时安装了多个代理工具的证书,可能会产生冲突。建议定期清理不需要的根证书。
  • 浏览器缓存:如果开启 HTTPS 抓包后浏览器提示证书错误,尝试清除浏览器缓存或重启浏览器。

五、过滤请求

在实际开发和测试中,请求量往往非常大。Fiddler 提供了强大的过滤功能,帮助我们快速定位目标请求。

5.1 使用 Filters 功能面板

点击右侧上方的 Filters 标签页,进入过滤配置面板。

Host 过滤
过滤选项 说明
No Zone Filter 不按区域过滤(默认)
Show Only Intranet Hosts 只显示内网主机的请求
Show Only Internet Hosts 只显示外网主机的请求
No Host Filter 不按主机名过滤
Hide the following Hosts 隐藏指定主机的请求
Show Only the following Hosts 只显示指定主机的请求
Flag the following Hosts 标记指定主机的请求(高亮显示)

常用操作示例

# 只抓取特定域名的请求
Show Only the following Hosts:
  api.example.com
  www.example.com

# 隐藏静态资源请求
Hide the following Hosts:
  cdn.example.com
  static.example.com
Client Process 过滤
选项 说明
Show only traffic from 只显示指定进程的请求
Hide traffic from 隐藏指定进程的请求

可以点击 Find Process... 按钮,然后拖动靶心到目标窗口来选择进程。

URL 过滤
选项 说明
Show only if URL contains 只显示 URL 包含指定字符串的请求
Hide if URL contains 隐藏 URL 包含指定字符串的请求

常用操作示例

# 只显示 API 接口请求
Show only if URL contains: /api/

# 隐藏图片、CSS、JS 等静态资源
Hide if URL contains: .jpg .png .gif .css .js .ico .svg .woff .ttf
请求头/响应头过滤
选项 说明
Show only if Header contains 只显示包含指定请求头的请求
Hide if Header contains 隐藏包含指定请求头的请求

常用操作示例

# 只显示 JSON 接口请求
Show only if Header contains: Content-Type: application/json

# 隐藏缓存请求
Hide if Header contains: If-None-Match
响应状态码过滤
选项 说明
Hide success (2xx) 隐藏成功的响应
Hide redirects (3xx) 隐藏重定向响应
Hide not modified (304) 隐藏 304 缓存响应
Hide client errors (4xx) 隐藏客户端错误响应
Hide server errors (5xx) 隐藏服务器错误响应
响应类型和大小过滤
选项 说明
Hide smaller than 隐藏小于指定大小的响应
Hide larger than 隐藏大于指定大小的响应

5.2 使用搜索功能过滤

Ctrl+F 或点击工具栏的 Find 按钮打开搜索对话框:

搜索选项 说明
Search in Requests 在请求中搜索
Search in Responses 在响应中搜索
Search in Headers 在头部信息中搜索
Search in Body 在请求/响应体中搜索
Search in URLs 在 URL 中搜索

搜索结果中匹配的会话会高亮显示,点击 Find Sessions 会选中所有匹配的会话。

5.3 使用 QuickExec 命令行过滤

在界面底部有一个命令行输入框(QuickExec),可以输入快捷命令:

# 只显示特定域名的请求
select host == api.example.com

# 只显示包含特定 URL 的请求
select uri contains /login

# 只显示状态码为 200 的请求
select result == 200

# 只显示 POST 请求
select method == POST

# 只显示大于 10KB 的响应
select size > 10240

# 隐藏所有图片请求
hide image

# 隐藏所有 CONNECT 请求
hide connect

# 清空会话列表
cls

5.4 快速过滤技巧

场景 操作方法
只看某个域名的请求 双击会话列表中该域名的任意请求 → 右键 → Hide Unselected
查看特定请求 在 QuickExec 中输入 select uri contains /login
排除静态资源 Filters → URL 过滤中输入 .jpg .png .gif .css .js .ico
只看失败请求 Filters → 勾选 Hide success (2xx)Hide redirects (3xx)
查看大文件请求 QuickExec 中输入 select size > 51200(大于 50KB)

六、删除数据

6.1 清除会话数据

方法一:工具栏按钮
  • 点击工具栏的 Remove All 按钮(或按快捷键 Ctrl+X
方法二:菜单操作
  • EditRemove → 选择清除范围
方法三:右键菜单
  • 在会话列表中右键 → Remove → 选择清除范围
清除选项
选项 说明
All Sessions 清除所有会话
Selected Sessions 清除选中的会话
Unselected Sessions 清除非选中的会话
Duplicate Response Bodies 清除重复的响应体

6.2 清除浏览器缓存

在 Fiddler 中可以直接清除 WinINET(IE/Edge/Chrome 使用的底层网络库)缓存:

  • 点击工具栏的 Clear Cache 按钮

这等同于在 IE 的 Internet 选项中清除缓存,会影响所有使用 WinINET 的浏览器。

6.3 清除 Cookie

# 方法一:通过 QuickExec 命令
# 选中所有会话后删除 Cookie
cookie: remove all

# 方法二:通过 FiddlerScript
# 在 CustomRules.js 中添加
static function OnBeforeRequest(oSession: Session) {
    oSession.oRequest.headers.Remove("Cookie");
}

6.4 清除 HTTPS 证书

如果需要重新安装 Fiddler 证书:

  1. 打开 ToolsOptionsHTTPS
  2. 点击 ActionsReset All Certificates
  3. 确认重置后,Fiddler 会重新生成并安装根证书

6.5 导出和清除会话文件

# 导出会话
File → Save → 选择保存路径(.saz 格式)

# 导入会话
File → Load → 选择 .saz 文件

# 删除已保存的会话文件
直接在文件管理器中删除 .saz 文件即可

七、接口基础概述

7.1 什么是 API 接口

API(Application Programming Interface,应用程序编程接口)是前后端交互的桥梁。前端通过发送 HTTP 请求调用后端 API,后端处理后返回数据。

7.2 HTTP 请求方法

方法 说明 典型用途
GET 获取资源 查询数据列表、获取详情
POST 创建资源 提交表单、创建新数据
PUT 更新资源(全量) 更新完整信息
PATCH 更新资源(部分) 修改部分字段
DELETE 删除资源 删除数据

7.3 HTTP 状态码

2xx 成功
状态码 说明 含义
200 OK 请求成功
201 Created 创建成功
204 No Content 成功但无返回内容
206 Partial Content 部分内容(断点续传)
3xx 重定向
状态码 说明 含义
301 Moved Permanently 永久重定向
302 Found 临时重定向
304 Not Modified 未修改(使用缓存)
4xx 客户端错误
状态码 说明 含义
400 Bad Request 请求参数错误
401 Unauthorized 未认证(需要登录)
403 Forbidden 无权限访问
404 Not Found 资源不存在
405 Method Not Allowed 请求方法不被允许
408 Request Timeout 请求超时
429 Too Many Requests 请求过于频繁(限流)
5xx 服务器错误
状态码 说明 含义
500 Internal Server Error 服务器内部错误
502 Bad Gateway 网关错误
503 Service Unavailable 服务不可用
504 Gateway Timeout 网关超时

7.4 常见的 Content-Type

类型 说明 示例
application/json JSON 数据 {"name":"张三"}
application/x-www-form-urlencoded 表单提交 name=%E5%BC%A0%E4%B8%89&age=20
multipart/form-data 文件上传 包含文件和表单数据
text/html HTML 页面 <html>...</html>
text/plain 纯文本 简单文本内容
application/xml XML 数据 <user><name>张三</name></user>
application/octet-stream 二进制流 文件下载

7.5 接口 URL 的组成

https://api.example.com:443/v1/users?page=1&size=10
|____|  |______________| |_| |_____________| |____________|
  |          |           |         |               |
 协议       域名        端口      路径            查询参数

八、请求响应报文

8.1 HTTP 请求报文结构

一个完整的 HTTP 请求由三部分组成:请求行请求头请求体

示例:GET 请求
GET /api/users?page=1 HTTP/1.1
Host: api.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.xxx
Cookie: session_id=abc123; user_id=1001
Connection: keep-alive
示例:POST 请求
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Content-Length: 88
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.xxx
Cookie: session_id=abc123; user_id=1001

{
    "name": "张三",
    "email": "zhangsan@example.com",
    "age": 25,
    "phone": "13800138000"
}
请求报文各部分说明
部分 说明 示例
请求行 请求方法 + URL路径 + 协议版本 POST /api/users HTTP/1.1
请求头 附加的元数据信息 Content-Type: application/json
空行 请求头和请求体之间的分隔符 (一个空行)
请求体 实际发送的数据 {"name":"张三"}
常用请求头
请求头 说明
Host 目标服务器域名
User-Agent 客户端标识(浏览器/系统信息)
Accept 客户端可接受的响应内容类型
Accept-Language 接受的语言
Accept-Encoding 接受的编码方式(gzip、deflate 等)
Content-Type 请求体的数据格式
Content-Length 请求体的长度(字节)
Authorization 认证信息(Token、Basic Auth 等)
Cookie Cookie 信息
Referer 来源页面 URL
Cache-Control 缓存控制指令
If-None-Match 条件请求,配合 ETag 使用
X-Requested-With 标识是否为 AJAX 请求

8.2 HTTP 响应报文结构

一个完整的 HTTP 响应由三部分组成:状态行响应头响应体

示例:成功响应
HTTP/1.1 200 OK
Date: Fri, 11 Jul 2026 08:00:00 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 256
Server: nginx/1.24.0
Cache-Control: no-cache
ETag: "a1b2c3d4e5f6"

{
    "code": 200,
    "message": "success",
    "data": {
        "id": 1001,
        "name": "张三",
        "email": "zhangsan@example.com",
        "phone": "138****8000"
    },
    "timestamp": 1689072000000
}
示例:错误响应
HTTP/1.1 401 Unauthorized
Date: Fri, 11 Jul 2026 08:00:00 GMT
Content-Type: application/json; charset=utf-8
WWW-Authenticate: Bearer

{
    "code": 401,
    "message": "未登录或登录已过期,请重新登录",
    "data": null,
    "timestamp": 1689072000000
}
响应报文各部分说明
部分 说明 示例
状态行 协议版本 + 状态码 + 状态描述 HTTP/1.1 200 OK
响应头 附加的元数据信息 Content-Type: application/json
空行 响应头和响应体之间的分隔符 (一个空行)
响应体 服务器返回的数据 {"code":200,...}
常用响应头
响应头 说明
Content-Type 响应体的数据格式和编码
Content-Length 响应体的长度(字节)
Content-Encoding 响应体的编码方式(gzip、br 等)
Cache-Control 缓存控制指令
ETag 资源的唯一标识,用于缓存验证
Last-Modified 资源最后修改时间
Set-Cookie 服务端设置 Cookie
Location 重定向的目标 URL(配合 3xx 状态码)
Server 服务器标识
Access-Control-Allow-Origin CORS 跨域允许的来源
Authorization 认证信息

8.3 在 Fiddler 中查看报文

  1. 在会话列表中点击目标请求
  2. 右侧上方的 Request 面板显示请求报文
  3. 右侧下方的 Response 面板显示响应报文
  4. 点击 Raw 标签查看完整的原始报文
  5. 点击 Headers 标签查看格式化的头部信息
  6. 点击 TextView 标签查看文本格式的请求/响应体

九、模拟弱网测试

9.1 什么是弱网测试

弱网测试是指在模拟网络条件较差(如 2G、3G、高延迟、高丢包率等)的环境下,验证应用的:

  • 加载性能和用户体验
  • 请求超时处理
  • 数据完整性
  • 重试机制
  • 错误提示的友好性

9.2 使用 Fiddler 内置弱网模拟

Fiddler 内置了简单的弱网模拟功能:

  1. 点击菜单 RulesPerformanceSimulate Modem Speeds
  2. 勾选后,所有请求会被模拟为拨号调制解调器的速度(约 33.6 Kbps)
  3. 再次点击可取消模拟

9.3 使用 FiddlerScript 自定义弱网

点击 RulesCustomize Rules,在打开的脚本编辑器中找到 m_SimulateModem 相关代码:

// 在 Rules 块中添加自定义网络配置
var m_SimulateModem: boolean = true;

// 模拟不同网络环境的延迟配置(单位:毫秒)
var BRACKET_LATENCY = 300;  // 基础延迟

// 在 OnBeforeRequest 函数中添加:
static function OnBeforeRequest(oSession: Session) {
    // 模拟 3G 网络(上传延迟 500ms,下载延迟 1000ms)
    if (m_SimulateModem) {
        oSession["request-trickle-delay"] = "500";
        oSession["response-trickle-delay"] = "1000";
    }
}

9.4 常见网络环境参数参考

网络类型 下行速度 上行速度 延迟 Fiddler 配置参考
2G (GPRS) 50 Kbps 30 Kbps 500ms request: 300, response: 800
2G (EDGE) 200 Kbps 100 Kbps 300ms request: 150, response: 400
3G (UMTS) 384 Kbps 128 Kbps 200ms request: 80, response: 200
3G (HSPA) 2 Mbps 1 Mbps 100ms request: 40, response: 100
4G LTE 50 Mbps 25 Mbps 50ms request: 10, response: 20
WiFi 100+ Mbps 100+ Mbps 10ms request: 2, response: 5

9.5 高级弱网模拟脚本示例

// 自定义弱网模拟 - 根据条件选择不同的网络配置
static function OnBeforeRequest(oSession: Session) {
    if (m_SimulateModem) {

        // 方案一:模拟 3G 网络
        // 上行延迟 200ms,下行延迟 500ms
        oSession["request-trickle-delay"]  = "200";
        oSession["response-trickle-delay"] = "500";

        // 方案二:模拟丢包
        // 随机丢弃 10% 的请求
        if (Math.random() < 0.1) {
            oSession["request-trickle-delay"]  = "30000";  // 30秒延迟等同于超时
        }

        // 方案三:针对特定接口模拟弱网
        if (oSession.uriContains("/api/upload")) {
            oSession["request-trickle-delay"]  = "1000";   // 上传接口延迟 1秒
            oSession["response-trickle-delay"] = "2000";   // 下载延迟 2秒
        }
    }
}

9.6 弱网测试检查清单

  • 页面加载是否有 Loading 动画或进度提示
  • 请求超时是否有友好的错误提示
  • 超时后是否支持重试
  • 数据加载过程中是否可以正常操作
  • 图片/视频是否有占位符或懒加载
  • 长时间加载是否会触发 ANR(Application Not Responding)
  • 网络恢复后是否能自动重新加载
  • 弱网下数据是否完整传输

十、定位 Bug 前后端问题

10.1 前后端 Bug 分离原则

通过 Fiddler 抓包分析请求和响应,可以快速判断 Bug 是前端问题还是后端问题:

┌─────────────────────────────────────────────────────────────┐
│                    Bug 判断流程                              │
│                                                              │
│  1. 在 Fiddler 中找到该请求                                  │
│  2. 检查请求报文(Request)                                   │
│     ├─ 请求参数是否正确?                                     │
│     ├─ 请求头是否正确?(Token、Content-Type 等)              │
│     ├─ 请求 URL 是否正确?                                   │
│     └─ 请求体是否完整?                                      │
│  3. 检查响应报文(Response)                                  │
│     ├─ 状态码是否正确?                                      │
│     ├─ 响应体数据是否正确?                                   │
│     └─ 响应格式是否符合约定?                                 │
│  4. 判断结论                                                 │
│     ├─ 请求不正确 → 前端 Bug                                 │
│     ├─ 请求正确,响应不正确 → 后端 Bug                        │
│     └─ 请求和响应都正确,但页面显示异常 → 前端渲染 Bug          │
└─────────────────────────────────────────────────────────────┘

10.2 具体判断方法

情况一:前端 Bug

特征:请求报文存在问题

检查项 说明
请求参数错误 参数名拼写错误、参数类型错误、参数值错误
请求头缺失 缺少 Authorization、Content-Type 等必要头部
请求 URL 错误 接口地址拼写错误、路径参数缺失
请求体不完整 必填字段缺失、字段格式不正确
请求方法错误 应该用 POST 却用了 GET

Fiddler 操作步骤

  1. 在 Fiddler 中找到该请求
  2. 点击 Raw 标签查看原始请求报文
  3. 对比 API 文档检查请求参数是否正确
  4. 如果请求不正确,定位到前端代码中发起请求的部分
情况二:后端 Bug

特征:请求报文正确,但响应存在问题

检查项 说明
状态码错误 返回 500、400 等错误状态码
响应数据错误 数据格式不对、字段缺失、数据不一致
响应超时 响应时间过长(超过合理范围)
接口报错 返回错误信息但前端没有异常处理
数据不一致 同一接口多次调用返回不同结果

Fiddler 操作步骤

  1. 在 Fiddler 中找到该请求
  2. 确认请求报文正确无误
  3. 点击 Response 区域的 Raw 标签查看响应
  4. 分析响应内容,将错误信息反馈给后端
情况三:前端渲染 Bug

特征:请求和响应都正确,但页面显示异常

检查项 说明
数据正确但显示错误 前端解析或渲染逻辑有问题
数据格式处理错误 日期格式、金额格式、状态码映射等
列表渲染问题 分页、排序、过滤逻辑错误
表单回显问题 数据绑定或赋值逻辑有问题

10.3 实战分析示例

场景:用户反馈登录后页面显示空白

分析步骤

1. 打开 Fiddler,开启抓包
2. 执行登录操作
3. 在 Fiddler 中找到登录接口请求

检查请求:
  POST /api/login HTTP/1.1
  Content-Type: application/json

  {"username":"admin","password":"123456"}
  → 请求参数正确 ✓

检查响应:
  HTTP/1.1 200 OK
  Content-Type: application/json

  {"code":200,"data":{"token":"xxx","userInfo":{}}}
  → 返回 200,但 userInfo 是空对象 ✗

4. 继续查找登录后的首页数据接口:
  GET /api/user/info HTTP/1.1
  Authorization: Bearer xxx

  → 请求头中 Token 正确 ✓

检查响应:
  HTTP/1.1 200 OK

  {"code":200,"data":{"nickname":"管理员","avatar":"/img/admin.png"}}
  → 数据正确 ✓

5. 综合判断:登录接口返回的 userInfo 为空,但后续接口数据正常
   → 后端 Bug:登录接口的 userInfo 字段返回不完整

10.4 FiddlerScript 辅助定位

// 在 FiddlerScript 中添加日志记录,辅助分析
static function OnBeforeRequest(oSession: Session) {
    // 记录关键请求的详细信息
    if (oSession.uriContains("/api/")) {
        oSession["ui-backcolor"] = "#FFE4E1";  // 标记 API 请求为浅红色
    }
}

static function OnBeforeResponse(oSession: Session) {
    // 标记慢响应(超过 2 秒)
    if (oSession.TimedOut) {
        oSession["ui-backcolor"] = "#FF6347";  // 红色标记
        oSession["ui-comments"] = "⚠️ 请求超时";
    }

    // 标记 5xx 错误
    if (oSession.responseCode >= 500) {
        oSession["ui-backcolor"] = "#FF0000";  // 深红色标记
        oSession["ui-comments"] = "❌ 服务器错误";
    }
}

十一、做 Mock 测试

11.1 什么是 Mock 测试

Mock 测试是在测试过程中,用模拟数据替代真实后端返回的数据,实现前后端解耦开发和测试。常见场景:

  • 后端接口尚未开发完成
  • 需要测试异常场景(如 500 错误、网络超时)
  • 需要大量测试数据
  • 后端环境不稳定

11.2 使用 Fiddler AutoResponder 做 Mock

AutoResponder 是 Fiddler 内置的请求拦截和模拟响应功能。

操作步骤
  1. 在会话列表中找到目标请求
  2. 右键点击 → 选择 Unlock for Editing(如需要)
  3. 将该请求拖拽到右下角的 AutoResponder 标签页
  4. 在 AutoResponder 中配置匹配规则和响应内容
配置界面说明
┌─────────────────────────────────────────────────────┐
│  AutoResponder                                     │
│                                                     │
│  ☑ Enable rules                                    │
│  ☑ Unmatched requests passthrough                  │
│                                                     │
│  匹配规则          │  响应内容                      │
│  ─────────────────┼─────────────────────────────    │
│  EXACT:/api/login │  C:\mock\login_success.json    │
│  regex:.*/api/user│  C:\mock\user_info.json        │
│  *                │  *passthrough*                  │
└─────────────────────────────────────────────────────┘
匹配规则类型
规则类型 说明 示例
EXACT: 精确匹配 URL EXACT:/api/users
regex: 正则表达式匹配 regex:(?insx)/api/user.*
prefix: 前缀匹配 prefix:/api/v1
glob: 通配符匹配 *api/user*
default 默认匹配所有 *
响应内容类型
响应类型 说明
本地文件 选择本地的 JSON/HTML/XML 文件作为响应
200_OK 返回 200 状态码和空内容
404_NotFound 返回 404 错误
500ServerError 返回 500 错误
Delay 延迟指定毫秒数后响应
Drop Connection 模拟断开连接
Find a file… 选择本地文件
Custom Response… 自定义响应内容

11.3 Mock 数据文件示例

登录成功响应 (login_success.json)
{
    "code": 200,
    "message": "登录成功",
    "data": {
        "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.mock_token",
        "userInfo": {
            "id": 1001,
            "username": "admin",
            "nickname": "管理员",
            "email": "admin@example.com",
            "avatar": "/img/default-avatar.png",
            "role": "admin"
        },
        "permissions": ["read", "write", "delete", "admin"]
    }
}
登录失败响应 (login_fail.json)
{
    "code": 401,
    "message": "用户名或密码错误",
    "data": null
}
用户列表响应 (user_list.json)
{
    "code": 200,
    "message": "success",
    "data": {
        "total": 100,
        "page": 1,
        "size": 10,
        "list": [
            {"id": 1, "name": "张三", "email": "zhangsan@example.com"},
            {"id": 2, "name": "李四", "email": "lisi@example.com"},
            {"id": 3, "name": "王五", "email": "wangwu@example.com"}
        ]
    }
}
服务器错误响应 (server_error.json)
{
    "code": 500,
    "message": "服务器内部错误,请稍后重试",
    "data": null,
    "error": "Database connection timeout"
}

11.4 使用 FiddlerScript 做高级 Mock

// 在 CustomRules.js 中实现动态 Mock
static function OnBeforeResponse(oSession: Session) {

    // Mock 登录接口 - 模拟成功
    if (oSession.uriContains("/api/login") && oSession.RequestMethod == "POST") {
        oSession.oResponse["Content-Type"] = "application/json";
        oSession.utilSetResponseBody('{"code":200,"message":"登录成功","data":{"token":"mock_token_12345"}}');
    }

    // Mock 用户列表 - 返回 10 条数据
    if (oSession.uriContains("/api/users") && oSession.RequestMethod == "GET") {
        var mockData = '{"code":200,"data":{"total":100,"list":[';
        for (var i = 1; i <= 10; i++) {
            if (i > 1) mockData += ',';
            mockData += '{"id":' + i + ',"name":"用户' + i + '"}';
        }
        mockData += ']}}';
        oSession.oResponse["Content-Type"] = "application/json";
        oSession.utilSetResponseBody(mockData);
    }

    // Mock 服务器错误 - 模拟 500 错误
    if (oSession.uriContains("/api/crash")) {
        oSession.oResponse["Content-Type"] = "application/json";
        oSession.responseCode = 500;
        oSession.utilSetResponseBody('{"code":500,"message":"模拟服务器错误"}');
    }

    // Mock 慢响应 - 延迟 5 秒
    if (oSession.uriContains("/api/slow")) {
        oSession["request-trickle-delay"] = "5000";
    }
}

11.5 Mock 测试场景清单

测试场景 Mock 配置
正常流程 返回 200 + 正确数据
参数错误 返回 400 + 错误提示
未登录 返回 401 + 未认证提示
无权限 返回 403 + 无权限提示
资源不存在 返回 404 + 未找到提示
服务器错误 返回 500 + 错误提示
网络超时 延迟响应(设置较长的 delay)
断网 Drop Connection
返回空数据 返回 200 + 空数组/空对象
返回大数据 返回 200 + 大量数据(测试性能)

十二、篡改数据

12.1 什么是数据篡改

数据篡改是在请求发送到服务器之前修改请求数据,或在响应返回给客户端之前修改响应数据。这是测试系统健壮性的重要手段。

12.2 设置断点

方法一:菜单设置断点

点击 RulesAutomatic Breakpoints

断点类型 说明
Before Requests 在请求发送前暂停(快捷键 F11
After Responses 在响应返回前暂停(快捷键 Shift+F11
Disabled 取消所有断点
方法二:QuickExec 命令设置断点
# 对特定 URL 设置请求断点
bpu /api/login

# 对特定 URL 设置响应断点
bpafter /api/users

# 取消所有断点
bpu
bpafter
断点状态标识

在会话列表中:

  • 红色 🔴 图标:请求/响应被断点拦截,等待手动编辑
  • 绿色 🟢 图标:已放行的断点请求

12.3 篡改请求数据

操作步骤
  1. 设置请求断点:RulesAutomatic BreakpointsBefore Requests(或按 F11)
  2. 在浏览器中执行操作(如点击登录按钮)
  3. Fiddler 会拦截该请求,会话列表中出现红色图标的请求
  4. 点击该请求,在右侧 Request 面板中修改数据
  5. 修改完成后,点击 Run to Completion 放行请求
常见篡改场景
场景 篡改内容 目的
修改登录参数 更改用户名/密码 测试登录验证
修改表单数据 更改必填字段为空 测试必填校验
修改金额数据 更改为 0 或负数 测试金额校验
修改用户 ID 更改为其他用户 测试越权访问
修改 Token 删除/修改认证 Token 测试权限控制
添加恶意字符 在参数中注入 SQL/脚本 测试安全防护
篡改请求示例
原始请求:
  POST /api/transfer HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer user_token

  {"fromAccount":"A001","toAccount":"B002","amount":1000}

篡改为:
  POST /api/transfer HTTP/1.1
  Content-Type: application/json
  Authorization: Bearer user_token

  {"fromAccount":"A001","toAccount":"B002","amount":-1000}
  → 测试后端是否校验金额为负数

篡改为:
  POST /api/transfer HTTP/1.1
  Content-Type: application/json

  {"fromAccount":"A001","toAccount":"B002","amount":1000}
  → 删除 Authorization 头,测试是否需要登录

12.4 篡改响应数据

操作步骤
  1. 设置响应断点:RulesAutomatic BreakpointsAfter Responses(或按 Shift+F11)
  2. 在浏览器中执行操作
  3. Fiddler 会拦截服务器的响应
  4. 在右侧 Response 面板中修改响应内容
  5. 修改完成后,点击 Run to Completion 放行响应
篡改响应示例
原始响应:
  HTTP/1.1 200 OK
  Content-Type: application/json

  {"code":200,"data":{"role":"user","balance":5000}}

篡改为:
  {"code":200,"data":{"role":"admin","balance":999999}}
  → 测试前端是否会因 role 变化而显示管理员功能
  → 测试前端是否会因 balance 变化而显示错误金额

篡改为:
  {"code":200,"data":null}
  → 测试前端对空数据的处理能力

篡改为(超长数据):
  {"code":200,"data":{"name":"AAAA...(10000个字符)"}}
  → 测试前端对超长字符串的处理和截断

12.5 使用 FiddlerScript 自动篡改数据

// 自动篡改请求 - 给所有请求添加测试标记
static function OnBeforeRequest(oSession: Session) {
    // 给所有 API 请求添加测试环境标记
    if (oSession.uriContains("/api/")) {
        oSession.oRequest["X-Test-Mode"] = "true";
        oSession.oRequest["X-Test-User"] = "fiddler_test";
    }

    // 自动修改登录请求的密码(测试弱密码)
    if (oSession.uriContains("/api/login") && oSession.RequestMethod == "POST") {
        oSession.utilSetRequestBody('{"username":"admin","password":"wrong_password"}');
    }
}

// 自动篡改响应 - 修改用户角色
static function OnBeforeResponse(oSession: Session) {
    if (oSession.uriContains("/api/user/info")) {
        var body = oSession.GetResponseBodyAsString();
        body = body.Replace('"role":"user"', '"role":"admin"');
        oSession.utilSetResponseBody(body);
    }
}

12.6 数据篡改安全测试清单

  • 越权访问测试(修改用户 ID/Token)
  • 参数类型篡改(字符串→数字、数字→字符串)
  • 参数边界测试(最大值、最小值、0、负数、空值)
  • SQL 注入测试(在参数中添加 ' OR 1=1 --
  • XSS 测试(在参数中添加 <script>alert(1)</script>
  • 超长字符串测试
  • 特殊字符测试(Unicode、emoji、换行符等)
  • 必填字段删除测试
  • 重复提交测试
  • 并发请求测试

十三、抓包环境测试

13.1 测试环境分类

环境 说明 域名特征
开发环境 (DEV) 开发人员本地或开发服务器 dev.xxx.comlocalhost
测试环境 (TEST) 测试人员使用的环境 test.xxx.comqa.xxx.com
预发布环境 (STAGING) 上线前的验证环境 staging.xxx.compre.xxx.com
生产环境 (PROD) 正式对外提供服务 www.xxx.comapi.xxx.com

13.2 不同环境的抓包配置

开发环境抓包
# 本地开发环境(localhost)
- 启动 Fiddler
- 确保浏览器/应用使用系统代理
- 直接访问 localhost 即可抓包

# 本地开发环境(指定 IP)
- 如果后端运行在本地其他端口
- 访问 http://127.0.0.1:8080 即可
- Fiddler 默认会捕获所有经过代理的请求
测试环境抓包
# 方案一:通过系统代理
- Fiddler 启动后自动设置系统代理
- 浏览器/应用通过系统代理访问测试环境

# 方案二:通过 FiddlerScript 强制转发
# 在 CustomRules.js 中添加:
static function OnBeforeRequest(oSession: Session) {
    // 将生产域名转发到测试环境
    if (oSession.HostnameIs("www.example.com")) {
        oSession.hostname = "test.example.com";
    }
}
生产环境抓包(需谨慎)
# 注意事项
1. 生产环境数据敏感,抓包前需获得授权
2. 不要在生产环境篡改数据
3. 抓包结束后立即关闭 HTTPS 解密
4. 不要保存包含敏感信息的会话文件

# 操作步骤
1. Fiddler → Tools → Options → HTTPS
2. 勾选 Decrypt HTTPS traffic
3. 开始抓包(F12)
4. 完成后立即关闭抓包和 HTTPS 解密

13.3 手机端抓包配置

步骤一:配置 Fiddler 允许远程连接
  1. ToolsOptionsConnections
  2. 勾选 Allow remote computers to connect
  3. 重启 Fiddler
步骤二:查看电脑 IP 地址

在 Fiddler 右上角可以看到电脑的 IP 地址,如 192.168.1.100

或者在 QuickExec 中输入:

!echo @ip
步骤三:手机配置代理

iOS 设备

  1. 打开 设置Wi-Fi
  2. 点击已连接的 Wi-Fi 网络
  3. 配置代理 → 手动
  4. 服务器:电脑 IP(如 192.168.1.100
  5. 端口:8888
  6. 保存

Android 设备

  1. 打开 设置WLAN
  2. 长按已连接的网络 → 修改网络
  3. 高级选项 → 代理 → 手动
  4. 代理主机名:电脑 IP
  5. 代理端口:8888
  6. 保存
步骤四:安装 Fiddler 根证书(抓 HTTPS 必须)

iOS

  1. 用手机浏览器访问 http://电脑IP:8888
  2. 点击 FiddlerRoot certificate 下载证书
  3. 安装描述文件
  4. 设置通用关于本机证书信任设置 → 启用 Fiddler 证书

Android

  1. 用手机浏览器访问 http://电脑IP:8888
  2. 下载并安装 FiddlerRoot certificate
  3. Android 7.0+ 需要额外操作:将证书安装为系统级信任证书(需 root)
常见手机抓包问题
问题 解决方案
手机无法联网 确认 Fiddler 已开启远程连接,检查防火墙设置
HTTPS 证书不受信任 按照上述步骤安装并信任证书
App 无法抓包 App 可能使用了 SSL Pinning,需特殊处理
Android 7.0+ 无法抓 HTTPS 需要 root 后将证书安装到系统证书目录

13.4 不同协议的抓包

HTTP 请求
  • 默认即可捕获,无需额外配置
HTTPS 请求
  • 需要开启 HTTPS 解密
  • 需要安装 Fiddler 根证书
WebSocket 请求
  • Fiddler 支持捕获 WebSocket 帧数据
  • 在会话列表中找到 WebSocket 请求
  • 点击后在右侧面板查看 WebSocket 帧内容
FTP 请求
  • Fiddler 不直接支持 FTP 抓包
  • 需要配合其他工具(如 Wireshark)

13.5 性能分析

使用 Statistics 功能
  1. 选中一个或多个会话
  2. 点击右侧的 Statistics 标签页
  3. 查看详细的性能数据:
指标 说明
Request Count 请求总数
Request Bytes 请求总大小
Response Bytes 响应总大小
Actual Speed 实际传输速度
Response Time 响应时间
DNS Lookup DNS 解析时间
TCP Handshake TCP 握手时间
HTTPS Handshake HTTPS 握手时间
使用 Timeline 功能
  1. 点击菜单 ViewTimeline
  2. 底部会显示请求的时间线视图
  3. 可以直观地看到:
    • 各请求的发起时间和完成时间
    • 请求之间的依赖关系
    • 并发请求的数量
    • 哪些请求耗时最长
慢接口分析技巧
# 在 QuickExec 中使用统计命令

# 查看选中会话的详细统计
stats

# 按响应时间排序(点击 Result 列旁边的 Time 列)

# 查找大于指定时间的请求
select elapsed > 3000

13.6 抓包最佳实践

开始抓包前
  • 明确本次抓包的目的和范围
  • 配置好过滤规则,减少干扰
  • 清空当前会话列表(Ctrl+X)
  • 确认 HTTPS 解密已正确配置(如需要)
抓包过程中
  • 保持 Fiddler 在前台运行
  • 及时使用过滤功能缩小范围
  • 对重要请求添加注释(右键 → Comment)
  • 定期清除不需要的会话,避免内存溢出
抓包结束后
  • 保存重要的会话文件(File → Save)
  • 关闭 HTTPS 解密功能
  • 关闭 Fiddler 的抓包功能(F12)
  • 清除浏览器缓存(如果修改了 HTTPS 证书)
常用快捷键
快捷键 功能
F12 开启/关闭抓包
F11 设置请求断点
Shift+F11 设置响应断点
Ctrl+F 搜索会话
Ctrl+X 清空会话列表
Ctrl+A 全选会话
Delete 删除选中会话
Ctrl+E 编码/解码工具
Ctrl+R 打开 FiddlerScript 编辑器

十四、FiddlerScript 快速参考

14.1 常用内置函数

// 获取请求/响应信息
oSession.fullUrl                    // 完整 URL
oSession.HostnameIs("host.com")    // 判断域名
oSession.uriContains("/api")       // 判断 URL 包含
oSession.RequestMethod             // 请求方法(GET/POST 等)
oSession.responseCode              // 响应状态码

// 读取请求/响应体
var requestBody = oSession.GetRequestBodyAsString();
var responseBody = oSession.GetResponseBodyAsString();

// 设置请求/响应体
oSession.utilSetRequestBody("new body");
oSession.utilSetResponseBody("new body");

// 修改请求头
oSession.oRequest["Header-Name"] = "value";
oSession.oRequest.headers.Remove("Header-Name");

// 修改响应头
oSession.oResponse["Header-Name"] = "value";

// 设置断点
oSession["x-breakpoint-request"] = "true";
oSession["x-breakpoint-response"] = "true";

14.2 常用脚本模板

日志输出
FiddlerObject.Log("这是一条日志消息");
弹窗提示
FiddlerObject.Alert("提示信息");
修改响应状态码
oSession.responseCode = 200;
修改响应体
oSession.utilSetResponseBody('{"key":"value"}');
添加响应头
oSession.oResponse["Access-Control-Allow-Origin"] = "*";

十五、常见问题 FAQ

Q1: Fiddler 启动后无法上网

原因:Fiddler 设置了系统代理,退出时未能正确恢复。

解决方案

  1. 打开 Internet 选项连接局域网设置
  2. 取消勾选 为 LAN 使用代理服务器
  3. 或者重新启动 Fiddler,它会自动恢复代理设置

Q2: 无法抓取 HTTPS 请求

解决方案

  1. 确认 HTTPS 解密已开启
  2. 重新安装 Fiddler 根证书
  3. 清除浏览器缓存
  4. 检查是否有其他代理工具冲突

Q3: 手机无法通过 Fiddler 抓包

解决方案

  1. 确认电脑和手机在同一局域网
  2. 确认 Fiddler 已开启远程连接
  3. 检查防火墙是否放行了 8888 端口
  4. 确认手机代理设置正确

Q4: Fiddler 抓包导致网页加载缓慢

原因:Fiddler 需要解密和记录所有请求,会增加一定延迟。

解决方案

  1. 关闭不需要的过滤功能
  2. 使用 Filters 缩小抓包范围
  3. 设置合理的会话保留数量

Q5: 如何只抓取某个进程的流量?

解决方案

  1. 点击工具栏的 Any Process 按钮(靶心图标)
  2. 拖动到目标进程的窗口上
  3. 释放鼠标即可只捕获该进程的流量
  4. 右键点击会话列表中的进程列也可以过滤

核心技能清单

技能 重要性 难度
HTTPS 抓包 ⭐⭐⭐⭐⭐ ⭐⭐
请求/响应分析 ⭐⭐⭐⭐⭐ ⭐⭐
过滤请求 ⭐⭐⭐⭐ ⭐⭐
数据篡改 ⭐⭐⭐⭐ ⭐⭐⭐
Mock 测试 ⭐⭐⭐⭐ ⭐⭐⭐
弱网模拟 ⭐⭐⭐ ⭐⭐
手机抓包 ⭐⭐⭐ ⭐⭐⭐
FiddlerScript ⭐⭐ ⭐⭐⭐⭐
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐