最近在工作中遇到一个问题是,针对同一个接口的指定参数值(post的boby的某个字段为XXX时)的请求,才将其拦截并修改返回值。研究了一下有两种方式可以实现。
fiddler everywhere
fiddler everywhere:是一款可以运行在任何浏览器,任何系统、跨平台(Windows、Mac、Linux)的一款Web调试代理工具(下载链接)。它记录了计算机和Internet之间的所有HTTP(S)通信,可以检查和编辑通信,并拥有Mock请求以及修改响应返回的能力。可以把它看成fiddler+postman。
如果想对同一接口的不同指定参数进行修改,可以添加rules,设置如果匹配boby中包含373(我涉及的情况此值唯一,可以直接这么筛选,如果需要更针对性的筛选可以设置boby Is equal to XXX)
设置完成后点击Execute按钮可以查看是否能筛选出数据,如可打开rules开关,在下次抓包时rules即可生效。可针对性打开具体某个rule开关。
rules中的condition和action的可配置项很多,具体使用说明可参考官方文档。
fiddler script
另一种方法就是使用Fiddler抓包工具,修改CustomRules.js脚本(打开路径:Rules-> Customize Rules)达到修改Http请求的Response中Body信息(如JSON串),其中我们比较常修改的方法如下:
- OnBeforeRequest:static function OnBeforeRequest (oSession: Session)函数在每次请求之前调用。在这个方法中修改Request的内容,我们用得最多。
- OnBeforeResponse:static function OnBeforeResponse (oSession: Session)函数在每次响应之前调用,在这个方法中修改 Response 的内容。
- static function OnExecAction (sParams: String [ ] )这个方法中包含 Fiddler 命令。命令是在Fiddler 界面中左下方的 QuickExec 中执行的。
拿我们上面的例子来说,我们就可以利用FiddlerScript获取请求参数,请求中有指定参数时修改返回值:
在OnBeforeResponse中增加处理代码如下:
if (oSession.fullUrl.Contains("http://xxx.xxxxxx.com/XX/XX"))
{
// 获取Response Body、Request Body中JSON字符串,转换为可编辑的JSONObject变量
var responseStringOriginal = oSession.GetResponseBodyAsString();
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(responseStringOriginal);
var requestStringOriginal=oSession.GetRequestBodyAsString();
var requestJSON = Fiddler.WebFormats.JSON.JsonDecode(requestStringOriginal);
if(requestJSON.JSONObject['type']==1){ //请求参数中,若type为1,对返回值做如下修改
// 修改字段
responseJSON.JSONObject['Message'] = "获取成功修改后后";
responseJSON.JSONObject['Info']['LiveInfoList'][0]['LiveName']="直播测试5修改返回值后";
// 添加字段
var teacherinfo= '[{"name":"Wang", "title":"senior"},'+
'{"name":"Li", "title":"senior"}]';
responseJSON.JSONObject['teacherinfo'] = Fiddler.WebFormats.JSON.JsonDecode(teacherinfo).JSONObject ;
// 重新设置Response Body
var responseStringDestinal = Fiddler.WebFormats.JSON.JsonEncode(responseJSON.JSONObject);
oSession.utilSetResponseBody(responseStringDestinal);
}
}
}
保存后再抓包即可生效。