接口测试 Fiddler 保存会话 (请求)

Heyniu · 2016年07月21日 · 最后由 lalala 回复于 2020年06月18日 · 4437 次阅读

Fiddler 下载地址

为什么要保存请求?

做这件事最重要的目的之一就是,最近我需要实现一个简单的验证服务器接口正确性的这么一个测试工具(脚本),顺便把这 (保存会话) 记录下来分享给大家。

有时间我会把我初步的想法整理好分享出来,大家一起来探讨它的可行性,它不一定适用你们的业务,但是非常适合我项目的业务。虽然它也可能难产,但是我想尽力去做、去完成,也算巩固一下自己的知识,应用到项目中去。

保存单个请求

选中某个请求,右键就能看到菜单中的 Save

单个请求

  • Selected Sessions

    • in ArchiveZIP 保存为 saz 文件,其实就是一个 zip 格式文件
    • as Text 以 txt 文件形式保存整个会话包括 Headers/Request/Response
    • as Text (Headers only) 仅保存头部
  • Request 保存请求信息

  • Response 保存响应体,即服务器返回的数据

  • and Open as Local File 保存 Response 信息,并打开文件

打开保存的请求文件

  • POST 类型

  • GET 类型

GET

乱码的解决方法

相信细心的你也注意到了,前面POST类型的请求,Response body是乱码,这并不是我们希望看到的。那样怎么做呢?下面贴张图,你就秒懂了。

Decode

没错,就是 Response body Fiddler 默认采用了 GZIP 压缩,只要我们勾选None,再导出就不是乱码了

保存所有请求

菜单 File >> Save >> All Sessions,文件将以 saz 的形式保存下来(实际就是一个 ZIP 文件,也可以加密保存)

SAZ 是一种以.SAZ 为后缀的文件格式。SAZ 是 Session Archive Zip 的缩写。 SAZ 文件用于保存 HTTP 请求的信息。 在Fiddler软件使用 SAZ 格式用来保存和读取 HTTP 请求信息。

_index.htm : 一个可选文件,便于用户直接阅读。这个文件在 SAZ 文件被加载时不会被处理,仅仅用于手工检查。

raw 文件夹:包含所有的记录了网络 Sesison 信息的文件。

在 raw 文件夹内,对于每一个网络 Sesison,会有三个文件:

sessid#_c.txt:包含客户端请求

sessid#_s.txt : 包含服务器端请求

sessid#_m.txt:包含一些元数据,比如:Session 标志位,socket 重用信息,等等。

Save All Sessions

自动保存请求的猜想

  • 过滤掉无关的请求,只关注自己想要的请求
  • 利用 Fiddler 的 Customize Rules 实现过滤(也可利用Filters功能实现过滤 >> 简便、快捷),自动保存
  • js 实现过滤时,如果已经保存过的请求,可以考虑不再保存(可选)

自动保存已实现

2016.07.21 14:20 更新

经过一上午的踩坑,终于把自动保存功能实现了,下面分享给大家。

先来看一张自动保存的请求片段

重点来了,下面是实现的 js 代码

操作步骤

  • Fiddler 菜单 >> Rules >> Customize Rules
  • 如果提示没有下载 Fiddler ScriptEditor 则按提示下载后进入下一步操作
  • 安装好 Fiddler ScriptEditor 后,就能打开 Customize Rules.js 文件
  • 编辑 Customize Rules.js 文件,并保存
  • 重启 fiddler

保存 Request

把下面代码贴在OnBeforeRequest()方法末尾

//过滤无关请求,只关注特定请求
if (oSession.fullUrl.Contains("szhome.com"))
{
    var fso;
    var file;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    //文件保存路径,可自定义
    file = fso.OpenTextFile("D:\\Fiddler Sessions\\Sessions.txt",8 ,true, true);
    file.writeLine("Request url: " + oSession.url);
    file.writeLine("Request header:" + "\n" + oSession.oRequest.headers);
    file.writeLine("Request body: " + oSession.GetRequestBodyAsString());
    file.writeLine("\n");
    file.close();
}

保存 Response

把下面代码贴在OnBeforeResponse()方法末尾

//过滤无关请求,只关注特定请求
if (oSession.fullUrl.Contains("szhome.com"))
{
    oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况
    var fso;
    var file;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    //文件保存路径,可自定义
    file = fso.OpenTextFile("D:\\Fiddler Sessions\\Sessions.txt",8 ,true, true);
    file.writeLine("Response code: " + oSession.responseCode);
    file.writeLine("Response body: " + oSession.GetResponseBodyAsString());
    file.writeLine("\n");
    file.close();
}
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 50 条回复 时间 点赞

saz 和 txt 估计没 HAR 好用

手动点赞

你这个也是要先抓 APP 的包吧,那可以用 Jmeter 的代理服务器抓包录制吗?也能拿到你想要的接口请求,然后循环使用。
不知道我是不是明白你的点了。

#5 楼 @zdx0122 差不多一个意思,实现的方式不一样而已

Heyniu #51 · 2016年07月21日 Author

#2 楼 @sanlengjingvv 没用过 HAR,不了解,现在已经实现自动保存请求了,希望对你也有用

#3 楼 @sycing 谈不上厉害,只是结合测试只的痛点,通过自己掌握的皮毛知识尝试去解决问题

Heyniu #10 · 2016年07月21日 Author

#4 楼 @chungeguo 谢谢支持😄

Heyniu [该话题已被删除] 中提及了此贴 07月24日 13:42

牛 B 给力

—— 来自 TesterHome 官方 安卓客户端

Heyniu [该话题已被删除] 中提及了此贴 08月08日 14:29

报错了:HRESULT:
0x800A004C (CTL_E_PATHNOTFOUND)

Heyniu #43 · 2016年08月09日 Author

#14 楼 @aliugenb 可以描述详细一点吗

#15 楼 @heyniu
我先在 d 盘创建个 fiddler session 的文件夹,就好了

#16 楼 @aliugenb 不好意思哈,疏忽了,这里的 js 没有判断文件夹不存在的时候创建文件夹,我后续补上 优化哈

#17 楼 @heyniu
response 报错不知道是哪边的权限问题,但是保存倒是正常的

Heyniu #22 · 2016年08月09日 Author

#18 楼 @aliugenb 一般是不会报错的,报错原因有 2 点
1.同一时间请求的数量太多
2.请求的响应体太大,存不了那么快,js 是单线程的,这个没办法
所以提供了请求右键 单独添加请求的功能,已经自动保存的请求是蓝色的,没自动保存的是黑色

@heyniu 我也报这个问题呢 没好多请求数量呢;

Heyniu [该话题已被删除] 中提及了此贴 08月09日 17:59
Heyniu #22 · 2016年08月10日 Author

#20 楼 @chucktest
1.是全部请求都不能自动保存吗?
2.自动保存过的请求是蓝色的
3.代码有全部 copy 进去吗?
4.代码只改动拦截的 host,以及判断接口正确性的逻辑

Heyniu [该话题已被删除] 中提及了此贴 08月15日 09:48

太厉害了,我这边按楼上的方式弄,不能自动保存,而且报字节超长 08:41:50:5490 HTTPSLint> Warning: ClientHello record was 508 bytes long. Some servers have problems with ClientHello's greater than 255 bytes. https://github.com/ssllabs/research/wiki/Long-Handshake-Intolerance;不知道是为什么

Heyniu #25 · 2016年08月18日 Author

#24 楼 @jeff1001 Windows 版?mac 版?http 还是 https

#25 楼 @heyniu windows http

Heyniu #30 · 2016年08月18日 Author

#26 楼 @jeff1001 有把这个自定义 Customize Rules js 贴上去吗?
看我这篇文章吧,底部有 github 地址,项目里面有个 fiddler js 你替换掉
https://testerhome.com/topics/5631

#28 楼 @jeff1001 不是每次都出现吧,这个出现是在接口返回太大的数据,而且同时又很多接口同时请求,才可能出现的,另外你需要修改
1.红色箭头改成你需要自动保存的 url 地址,去掉 http://

2.修改你接口 json 的判断逻辑,就是怎样的接口算正常的,不然全部当异常处理了

#29 楼 @heyniu 是不是正式投入使用了

Heyniu #33 · 2016年08月18日 Author

#30 楼 @mads 已经投入使用,效果显著

#29 楼 @heyniu 嗯嗯,我报错是没有改判断!👍 👍 👍

不会写,粘的
你的代码,第一次成功了,但是别的地方报错。
第二次失败了,没起作用

后来把域名那个地方改了,改为.com 也没用

Heyniu #36 · 2016年08月31日 Author

#35 楼 @liandada 是全部粘进去的吗

Heyniu #20 · 2016年08月31日 Author

#37 楼 @liandada 需要把之前的全部删掉,再拷贝进去,另外 oSession.fullUrl.Contains() 的意思是当 host 包含里面的值时就进入这个判断,目的是为了关注某个 host 的情况

OnBeforeRequest() 意思是把这里面的内容用你发的代码替换掉?

Heyniu #18 · 2016年08月31日 Author

#39 楼 @liandada 你先看懂我的意图先吧,替换是后面的事情
OnBeforeRequest() 这方法是返回 request 之前拦截的作用

😂 那你刚刚说的把之前的都删掉 ,是什么意思?

Heyniu #44 · 2016年08月31日 Author

#41 楼 @liandada 😂 我以为你已经理解了,我刚说的替换是整个 js 文件 内容删掉,替换我 js 的内容

Heyniu #44 · 2016年08月31日 Author

#43 楼 @mads 这 TM 就尴尬了😂

专门来注册一个账号聊表感谢~

您好,请问我想一个请求放在一个文件中,不放到同一个文件,如何实现呢?

你好,可以私聊你么 我最近也在做这个

过滤掉无关的请求,只关注自己想要的请求
利用 Fiddler 的 Customize Rules 实现过滤(也可利用 Filters 功能实现过滤 >> 简便、快捷),自动保存

我抓取一个 APP 的动态评论,然后让他保存到本地。数据库或者文档都行。但是不知道怎么编写程序

hi,麻烦问下,这样每次只能保存一个 Session 信息,如何自动保存多个呢

我想问的是,能用 java 写吗,我可以得到全部接口,但是就是请求参数还是有些问题,框架也不懂如何搭建

了解一下。

@Heyniu 太赞啦!谢谢谢谢作者!!

抓包能用 charlse 吗,fiddler 对 Mac 电脑不够友好

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册