Как ввести новый заголовок запроса с данными 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.

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