Fiddler AutoResponder должен вернуть ответ json с идентификатором сеанса jQuery, указанным в запросе

Мне нужна ваша помощь, я разрабатываю код JavaScript, который запрашивает веб-сервис и возвращает данные в формате JSON.

Когда я спрашиваю веб-сервис, как это:

HTTPS: // сервер / ServiceEndpoint ID = 12345

MyApplication добавляет некоторые другие параметры в URL моего веб-сервиса, например так:

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

Этот идентификатор сессии jQuery является общим.

Итак, я использую Fiddler для имитации ответа веб-сервиса. И мне нужно добавить этот идентификатор сеанса jQuery в начале моего ответа следующим образом:

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

Может кто-нибудь поможет мне сделать это.

Спасибо.

4 ответа

Решение

Я использовал 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);
    }

AutoResponder Fiddler не может сделать это сам (так как он не может изменять тела ответов на основе 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 в 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. Добавьте этот импорт вверху файла, если его там еще нет: import 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);
    }
    

Это преобразует JSON-ответ { "test": "testValue" } в jQuery9827345872635_982735982375({ "test": "testValue" }) (здесь обратный вызов jQuery - это случайная BS, сгенерированная для демонстрационных целей).

Другие вопросы по тегам