关于数据修改,你知道多少?!
Fiddler 功能
大家都说Fiddler工具很强大,那么Fiddler到底有哪些功能呢?我们用下面这幅图就可以简单地概括总结一下:
图片虽然不是很美观,但是将fiddler的功能总结得很是精辟,它高大上的内涵足以支撑简陋的门面,厉害了,老铁!
言归正传,从这幅图上我们可以很清晰的看出Fiddler是用来捕获数据,并对数据进行分析,甚至可以对数据进行修改。在平时的测试工作中用到最多的功能也是修改数据,在我的博客中浏览量最高的也是关于如何修改数据的文章,所以就专门写这篇文章来总结一下修改数据的几种方法,大家可以权衡一下利弊,根据实际情况来选择合适的方法,提高自己的工作效率。
一、打断点修改数据
(一)Request
打断点修改Request的数据,步骤如下:
1、设置Rules->Automatic Breakpoints->Before Requests。
2、发起请求,被Fiddler拦截。
3、双击被拦截的请求,在Inspectors->右上方(右上方展示的是request的相关信息)->SyntaxView tab页中直接修改数据,例子中我们将”country”: “CN” 修改为 “country”: “US”。在Inspectors其它类似的tab页中也可以修改数据,只是我比较习惯在SyntaxView 这个tab页中修改。数据可以做任何的修改,当然也可以整体替换这些请求的数据。
4、修改之后,点击绿色的Run to Completion 放行断点。
5、断点被放行之后,验证Request的参数是否修改成功,如图所示”country”: “US”,说明修改成功。
(二)Response
打断点修改response数据,步骤如下:
1、设置Rules->Automatic Breakpoints->Before Responses。
2、发起请求,被Fiddler拦截。
3、双击被拦截的请求,在Inspectors->右下方(右下方展示的是response相关的信息)->SyntaxView tab页中直接修改数据,数据可以被任意修改,例子中我们把”adaction”:”install” 修改成”adaction”:”install—zwf”。
4、修改之后,放行断点
5、断点被放行之后,验证response的数据是否修改成功。如图所示”adaction”:”install—zwf”,说明response的数据修改成功。
敲黑板知识点
OK,这个方法学会了吗?是不是很简单呢?!那我们来简单的分析总结一下:打断点修改Request数据的方法和修改Response数据的方法两者很相似,也很简单,在Fiddler的窗口界面上都可以完成操作。但是,转折来了啊,请大家注意,打断点修改数据的方法不太适合频繁的修改接口的数据,操作步骤虽不复杂但是搁不住大量的操作,在修改的过程中也很容易出现一不小心手一抖将数据修改错误的情况,同时这种方式修改数据要特别留意请求超时的问题。
二、局部修改数据
什么是局部修改数据呢?就是在接口原本的数据上进行数据的调整。我们不再在界面上操作了,而是通过修改CustomRules.js脚本来实现。
快捷键 Ctrl+R 打开 Fiddler ScriptEditor。
(一)Request
找到static function OnBeforeRequest(oSession: Session) {},在此方法中进行Request数据的修改。看方法名也很容易明白这个方法的作用,在发送请求之前进行的操作。
需求:把A接口Request中的country=CN 中的CN调整为US。
CustomRules.js脚本文档调整如下:
在 OnBeforeRequest(oSession: Session) 中添加以下的代码:
if (oSession.uriContains(“sdk/v4”)) {
oSession[“ui-color”] = “red”;
oSession.utilReplaceInRequest(“CN”, “US”);
}
讲解一下:
1、首先需要先定位到该接口,判断oSession的uri中是否包含关键字【sdk/v4】(请求的接口地址)
2、oSession[“ui-color”] = “red”;设置为该接口为红色,方便查看
3、oSession.utilReplaceInRequest(“CN”, “US”); 将Request的Body中所有的CN修改为US。
4、验证一下,如下图,说明修改成功。
该方法中最关键的方法是 oSession.utilReplaceInRequest(String A,String B),将Request的Body中所有的A修改为B,所有的A修改为B,所有的A修改为B,重要的事情说三遍。
在Response中也有与此相对应的方法,oSession.utilReplaceInResponse(String A,String B),将Response的Body中所有的A修改为B。
(二)Response
找到static function OnBeforeResponse(oSession: Session) {},在此方法中进行Response数据的修改。
上面utilReplaceIn**()修改数据的方法需要提前很明确地知道替换的内容,可是在实际的工作中接口的数据都是动态获取的,很显然这个方法就有些局限了。
工作中遇到最多的是调整某个key的value值,value值是动态的,但是key绝对是固定不变的。
一个请求无论是post方法还是get方法,发送的Request还是接收的Response都是有固定的数据格式,比如application/json,application/x-www-form-urlencoded。这些数据格式是通过content-type来定义,什么是content-type呢?顾名思义,内容类型,用来指定不同格式的数据信息。 就是在header中指定body中的数据格式。
application/x-www-form-urlencoded:数据被编码为名称/值对。这是标准的编码格式。 application/json : json格式的数据。
Fiddler中怎么查看content-type?
如下图所示,查看A请求Request的content-type信息:application/x-www-form-urlencoded:
如下图所示,查看A请求Response的content-type信息:application/json:
需求:将A接口Response的Body中的adaction(key)的value值变成”install—zwf”
CustomRules.js脚本文档调整如下:
在 OnBeforeResponse(oSession: Session) 中添加以下的代码:
if(oSession.uriContains(“sdk/v4”)) {
oSession[“ui-color”] = “red”;
var content_type = oSession.oResponse.headers[“Content-Type”];
//先判断Content-Type是否为json,为ture才可以进行json数据格式的转换
if(content_type.IndexOf(“application/json”) != -1){
// 获取Response Body中JSON字符串
var responseStringOriginal = oSession.GetResponseBodyAsString();
// 转换为可编辑的JSONObject变量
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
// 修改JSONObject变量,修改字段数据,这里涉及到json数据的解析,相关知识请大家自行脑补
responseJSON.JSONObject[0][“adaction”] = “install—zwf”;
// 重新设置Response Body
var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
oSession.utilSetResponseBody(responseStringDestinal);
}
}
捕捉请求,验证一下,如下图所示,修改成功:
一定要根据content-type的数据格式进行相应的数据转换和解析。同理,Request类似数据的修改也可以参照这个方法。
三、整体替换数据
整体替换数据,就是不在原本的接口数据上进行调整,直接将整个body一锅端都替换掉,这个思路很是简单粗暴呢。
(一)Request
CustomRules.js脚本文档调整如下:
static functionOnBeforeRequest(oSession: Session) {
//在OnBeforeRequest中增加以下代码
if(oSession.uriContains(“/sdk/v4”)) {
oSession[“ui-color”] = “green”;
//获取request中的body字符串
varstrBody = oSession.GetRequestBodyAsString();
strBody = “修改后的body内容 “;
oSession.utilSetRequestBody(strBody);
}
}
也可以通过类似的思路方法整体替换Response的数据。
(二)Response
整体替换Response的数据,除了上面提到的方法,还有一个更简单粗暴行之有效的方法。Fiddler的AutoResponder功能。如下图所示:
备注:Fiddler的AutoResponder功能若不是很熟悉的话,请大家自行学习一下(另一本书:fiddler抓包让数据无处可藏),本篇只提供这样的一种解决思路和方法。
敲黑板知识点
另外需要特别强调一点的是,如果A接口通过AutoResponder功能来替换Response的数据,那么该请求就没有发送到服务端,fiddler在前端捕获到A接口之后,就直接将AutoResponder指定的Response返回给前端或者客户端。这一点很是重要!重要!!重要!!!
四、总结
几种修改数据的方法已经和大家分享了,意不意外?惊不惊喜?开不开心?刺不刺激?居然还有这种操作?扎心了,老铁! 那么赶快操练起来吧,童鞋们,拿出你的FreeStyle,秀出你的魔性。