Fiddler AutoResponder 应该 returns 一个 json 响应,请求中给出 jQuery 会话 ID

Fiddler AutoResponder should returns a json response with jQuery session id given in request

我需要你的帮助,我开发了一个 javascript 代码来询问网络服务并以 JSON 格式取回数据。

当我这样询问网络服务时:

https://Server/ServiceEndPoint?id=12345

MyApplication 将一些其他参数添加到我的 Web 服务 URL,如下所示:

https://Server/ServiceEndPoint?id=12345&callback=jQuery18205735686348496944_1459416484049&_=1459416484892

这个 jQuery 会话 ID 是通用的。

所以,我正在使用 Fiddler 来模拟网络服务响应。我需要在我的回复开头添加此 jQuery 会话 ID,如下所示:

jQuery18205735686348496944_1459416484049({"data":"JSON data"})

谁能帮我做一下。

谢谢。

Fiddler 的 AutoResponder 本身无法执行此操作(因为它无法根据请求修改响应主体 URL)。相反,您需要编写一些简单的 FiddlerScript 来完成它。例如。规则 > 自定义规则 > OnBeforeRequest

    if (oSession.uriContains("server/ServiceEndPoint?")) {
        oSession.utilCreateResponseAndBypassServer();
        oSession.oResponse.headers.Add("Content-Type", "application/json");
        oSession.ResponseBody = System.IO.File.ReadAllBytes("C:\Your\File.txt");              
        // TODO:Copy the callback value to the front of the response string here.      
    }

我用 FiddlerScript 来做:

    if (oSession.HostnameIs("ServerName")){

        var body = "";
        var s_qs = (oSession.url + "?").split("?")[1];

        var querystring = HttpUtility.ParseQueryString(s_qs);
        var s_callback = querystring.Get("callback");

        if(oSession.uriContains("EndPointName"))
        {
            body = s_callback + "({'data':'datContent'})";
        }
        oSession.utilSetResponseBody(body);
    }

只需将此 FiddlerScript 添加到 OnBeforeResponse,您就可以继续使用 AutoResponder。这将自动为您修复回调名称:

    //Autofix all JSONP responses
    if (oSession.uriContains("callback=jQuery")) {

        var s_qs = (oSession.url + "?").split("?")[1];

        var querystring = HttpUtility.ParseQueryString(s_qs);
        var s_callback = querystring.Get("callback");           

        var body = new Regex("jQuery\d+_\d+").Replace(oSession.GetResponseBodyAsString(), s_callback);

        oSession.utilSetResponseBody(body);
    }

假设您要返回静态内容(文件内容或其他内容),您确实希望采用动态 jquery 回调函数名称并将其包装在您静态返回的任何内容周围。因此,我修改了上面的一个答案,并注意不要影响您未针对的 JSONP 响应。

在规则 > 自定义规则...中,执行以下操作:

  1. 如果文件顶部没有此导入,请将其添加到文件顶部:导入 System.Web;
  2. 找到 OnBeforeResponse(oSession) 方法并添加以下内容:

    //Autofix all JSONP responses
    if (oSession.uriContains("callback=jQuery")) {
        var s_qs = (oSession.url + "?").split("?")[1];
    
        var querystring = HttpUtility.ParseQueryString(s_qs);
        var s_callback = querystring.Get("callback"); 
    
        var oldBody = oSession.GetResponseBodyAsString();
        if (oldBody.StartsWith(s_callback)) return;
    
        var body = String.Concat(s_callback, "(", oSession.GetResponseBodyAsString(), ")");
    
        oSession.utilSetResponseBody(body);
    }
    

这会将 { "test": "testValue" } 的 JSON 响应转换为 jQuery9827345872635_982735982375({ "test": "testValue" }) (这里的 jQuery 回调是我为演示目的生成的随机 BS)。