#问题表现#
在使用fiddler做对请求做mock时,有时需要对jsonp格式响应进行映射;
jsonp响应的特点为callback为一个随机字符串;
使用普通的fiddler 做mock无法进行正常mock;
#解决办法#
- 保留响应中的callback函数名;
- 替换响应内容;
#实现#
- fiddler修改脚本,增加读取本地文件内容的函数;
- 修改OnBeforeResponse,替换响应内容;
- 下面代码快中OnBeforeResponse被注释的部分根据url中关键词进行替换;
- 注意本地文件的编码需要与请求的编码一致;
static function readFile(filename) { var fso = new ActiveXObject( "Scripting.FileSystemObject"); var f = fso.OpenTextFile(filename, 1); var s = ""; while(!f.AtEndOfStream) s += f.ReadLine(); f.Close(); return s; } static function OnBeforeResponse(oSession: Session) { if (m_Hide304s && oSession.responseCode == 304) { oSession["ui-hide"] = "true"; } /* if(oSession.url.indexOf("RrjfGetJifenPointList") > 1){ oSession.utilDecodeResponse(); var body = oSession.GetResponseBodyAsString(); var string = readFile("C:\Users\xxx\Desktop\aaabbb.txt"); var index = body.indexOf('('); var b = body.slice(0, index); body = b + '('+ string + ')'; oSession.utilSetResponseBody(body); } if(oSession.url.indexOf("RrjfGetAssistUserList") > 1){ oSession.utilDecodeResponse(); var body = oSession.GetResponseBodyAsString(); var string = readFile("C:\Users\xxx\Desktop\aaabbb.txt"); var index = body.indexOf('('); var b = body.slice(0, index); body = b + '('+ string + ')'; oSession.utilSetResponseBody(body); }
*/ if(oSession.url.indexOf("CommonAppointSubmit") > 1){ oSession.utilDecodeResponse(); var body = oSession.GetResponseBodyAsString(); var string = readFile("C:\Users\xxx\Desktop\aaabbb.txt"); var index = body.indexOf('('); var b = body.slice(0, index); body = b + '('+ string + ');}catch(e){}'; oSession.utilSetResponseBody(body); } }
#其他#
- fiddler使用微软的JScript,而JScript是可以对windows本地文件做读写,注意包括写操作;
- 后续想编写一个自己的fiddler插件,实现jsonp的mock,自动生成jmeter用例,上传指定url到扫描平台等功能,方便日常使用;