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

Heyniu · July 21, 2016 · Last by lalala replied at June 18, 2020 · 11108 hits

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 条回复 时间 点赞

useful

saz 和 txt 估计没 HAR 好用

厉害

手动点赞

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

Heyniu #6 · July 21, 2016 作者

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

Heyniu #7 · July 21, 2016 作者

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

Heyniu #8 · July 21, 2016 作者

#1楼 @jack1785 谢谢

Heyniu #9 · July 21, 2016 作者

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

Heyniu #10 · July 21, 2016 作者

#4楼 @chungeguo 谢谢支持😄

Heyniu [Topic was deleted] 中提及了此贴 24 Jul 13:42

牛B给力

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

Heyniu [Topic was deleted] 中提及了此贴 08 Aug 14:29

报错了:HRESULT:
0x800A004C (CTL_E_PATHNOTFOUND)

Heyniu #15 · August 09, 2016 作者

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

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

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

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

Heyniu #19 · August 09, 2016 作者

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

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

Heyniu [Topic was deleted] 中提及了此贴 09 Aug 17:59
Heyniu #22 · August 10, 2016 作者

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

Heyniu [Topic was deleted] 中提及了此贴 15 Aug 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 · August 18, 2016 作者

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

#25楼 @heyniu windows http

Heyniu #27 · August 18, 2016 作者

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

#27楼 @heyniu 贴了后!

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

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

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

Heyniu #31 · August 18, 2016 作者

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

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

Heyniu #33 · August 18, 2016 作者

#32楼 @jeff1001 😃 加油

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

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

Heyniu #36 · August 31, 2016 作者

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

shide

Heyniu #38 · August 31, 2016 作者

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

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

Heyniu #40 · August 31, 2016 作者

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

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

Heyniu #42 · August 31, 2016 作者

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

Heyniu #44 · August 31, 2016 作者

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

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

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

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

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

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

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

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

了解一下。

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up