Как ввести новый заголовок запроса с данными JSON в прокси-запрос?
Я пытаюсь внедрить новый заголовок запроса в поток запросов прокси с использованием политики JS для отправки на внутренний сервер. Когда я смотрю на трассировку отладки, я вижу, что данные json в заголовке запроса искажены.
Я пытаюсь ввести строку как
{"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}}
Но когда я смотрю в окно трассировки, я вижу это
{"scope":"","time_till":2264,id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM,"custom_data":{"c_id":"test_data"}}
Что я делаю неправильно?
var obj = {"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}};
var header_str = JSON.stringify(obj);
context.setVariable('json-header',header_str);
request.headers['x-json-hedar']= header_str;
3 ответа
Я проверил ваш код, и он, кажется, работает. Вот пример ответа, где я устанавливаю строку заголовка в качестве ответа:
HTTP/1.1 200 OK
User-Agent: curl/7.30.0
Accept: */*
x-json-header: {"scope":"","time_till":2264,"id_1":"hUXLXVqpA1J4vA9sayk2UttWNdM","custom_data":{"c_id":"test_data"}}
Content-Length: 0
Похоже, что это только проблема с сессией / трассировкой Apigee, так как значение заголовка было установлено правильно. Вот загрузка JSON сеанса отладки, показывающая это значение заголовка:
{
"name": "x-json-header",
"value": "{\"scope\":\"\",\"time_till\":2264,id_1\":\"hUXLXVqpA1J4vA9sayk2UttWNdM,\"custom_data\":{\"c_id\":\"test_data\"}}"
}
Вы можете видеть, что значение, переданное в пользовательский интерфейс для отображения отладочной информации, имеет искаженный json:
id_1\":\"hUXLXVqpA1J4vA9sayk2UttWNdM,
Похоже, что это не проблема с интерфейсом отладки / трассировки Apigee. Я вижу искаженный JSON, который просачивается в мой бэкэнд-сервис.
Вот заголовок, который я пытаюсь отправить -
{"timeStamp":"2349218349381274","latitude":"34.589","longitude":"-37.343","clientIp":"127.0.0.0","deviceId":"MOBILE_TEST_DEVICE_AGAIN","macAddress":"23:45:345:345","deviceType":"phone","deviceOS":"iOS","deviceModel":"iPhone 5S","connection":"5G","carrier":"Vodafone","refererURL":"http://www.google.com","xforwardedFor":"129.0.0.0","sessionId":"kfkls498327ksdjf","application":"mobile-app","appVersion":"7.6.5","serviceVersion":"1.0","userAgent":"Gecko"}
Но Apigee читает заголовок, как показано ниже. Обратите внимание на отсутствующие начальные кавычки из некоторых полей.
{"timeStamp":"2349218349381274",latitude":"34.589,longitude":"-37.343,clientIp":"127.0.0.0,deviceId":"MOBILE_TEST_DEVICE_AGAIN,macAddress":"23:45:345:345,deviceType":"phone,deviceOS":"iOS,deviceModel":"iPhone 5S,connection":"5G,carrier":"Vodafone,refererURL":"http://www.google.com,xforwardedFor":"129.0.0.0,sessionId":"kfkls498327ksdjf,application":"mobile-app,appVersion":"7.6.5,serviceVersion":"1.0,"userAgent":"Gecko"}
Заголовок используется в вызове сервиса для бэкэнда, который его анализирует. И правильно, я получаю ошибку ниже -
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('l' (code 108)): was expecting double-quote to start field name
at [Source: java.io.StringReader@22549cdc; line: 1, column: 35]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleUnusualFieldName(ReaderBasedJsonParser.java:1275)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._parseFieldName(ReaderBasedJsonParser.java:1170)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:611)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
Я сталкиваюсь со странным поведением при добавлении JSON в переменную контекста, например, например:
var header_str = JSON.stringify(obj);
context.setVariable('json-header',header_str);
Я ценю, что это пример, так что вы, возможно, не включили всю степень проблемы, но это обычно работает (теперь она не добавляется в переменную первой):
request.headers['x-json-header'] = JSON.stringify(obj);
Подобный код также работает, если вы можете отправить запрос из JavaScript
var headers = {"Accept": "application/json", "Accept-Language": "en"};
var sessionRequest = new Request(url, 'POST', headers, body);
var exchange = httpClient.send(sessionRequest);
exchange.waitForComplete()
if (exchange.isSuccess()){
var responseObj = exchange.getResponse().content.asJSON;
if (responseObj.error){
request.content += JSON.stringify(responseObj);
}
}
Кроме того, я успешно использовал политику AssignMessage для создания запроса, а затем политику Callout, чтобы прочитать сохраненный запрос, а затем сделать этот запрос и сохранить результат в объекте ответа, который затем может быть прочитан политикой Extract Variables.