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, на которые вы не ориентируетесь.
В Правилах> Настроить правила... сделайте следующее:
- Добавьте этот импорт вверху файла, если его там еще нет: import System.Web;
Найдите метод 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, сгенерированная для демонстрационных целей).