Я просто потратил 5 часов, пытаясь решить эту проблему, но я достиг нулевого прогресса.Я перепробовал все решения, которые смог найти, но я застрял.
Вот мои основные настройки и проблема, с которой я сталкиваюсь:
Основные настройки
Iесть 2 функции -
1) callGetApi (URL-адрес строки)
2) callPostApi (URL-адрес строки, String requestBody)
Код более или менее одинаков:
callGetApi:
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Basic " + apiAuthorizationString);
ResponseEntity<String> entity = null;
try {
entity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<Object>(headers), String.class);
apiOutput = gson.fromJson(entity.getBody().toString(), ApiOutput.class);
}
....
callPostApi:
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Basic " + apiAuthorizationString);
HttpEntity<Object> request = new HttpEntity<Object>(request_body, headers);
ResponseEntity<String> entity = null;
try {
entity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
apiOutput = gson.fromJson(entity.getBody().toString(), ApiOutput.class);
}
.....
Проблема
Проблема, с которой я сталкиваюсь, заключается в том, что в функции callGetApi () яЯ получаю правильный ответ, который правильно декодируется, но я получаю ответ в кодированной форме в функции CallPostApi (), которую я не могу декодировать.Оба они прекрасно работают в PostMan с одним и тем же вводом.
Вывод, который я получаю при вызове функции callPostApi ():
Вывод отладчика
Вывод, полученный в почтальоне для того же ввода и заголовков:
{"SuccessData":"Ticket not saved as no changes madeINC024","ErrorData":null,"AppData":null}
В функции callGetApi () я всегда получаю следующие заголовки:
{Transfer-Encoding=[chunked], Content-Type=[text/plain; charset=utf-8], Server=[Kestrel], X-Powered-By=[ASP.NET], Date=[Mon, 15 Oct 2018 13:05:27 GMT]}
В функции callPostApi () явсегда получать следующие заголовки:
{Transfer-Encoding=[chunked], Content-Type=[text/plain; charset=utf-16], Server=[Kestrel], X-Powered-By=[ASP.NET], Date=[Mon, 15 Oct 2018 13:06:58 GMT]}
И в то же время одна и та же конечная точка API для функции callPostApi () отправляет правильные заголовки в Postman (те же заголовки, что и для callGetApi () выше)
Решения, которые я пробовал:
Я попробовал все PnC из следующих:
1) Добавлен StringHttpMessageConverter для UTF-16 и UTF-8 как по отдельности, так и вместе:
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-16")));
2) Удалены все остальные конвертеры:
restTemplate.getMessageConverters().clear();
3) Добавлены следующие заголовки в callPostApi ():
headers.add("Accept-Encoding", "identity");
headers.add("Cache-Control", "no-cache");
headers.add("Accept-Charset", "utf-8");
headers.add("Accept", "application/json, charset=utf-8");
headers.set("Accept-Language", "en");
4) Использованы HttpHeaders вместоMultiValueMap:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.add("Authorization", "Basic " + apiAuthorizationString);
headers.add("Accept-Encoding", "identity");
headers.add("Cache-Control", "no-cache");
headers.add("Accept-Charset", "utf-8");
Что-то, что я пробовалпродемонстрировали некоторый прогресс:
entity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
//entity has the same data as the debugger screenshot I've attached above
byte[] utf8 = entity.getBody().toString().getBytes("UTF-16");
String string = new String(utf8, "UTF-8");
При выполнении приведенного выше кода массив строк содержит правильный выходной НО с пробелами между всеми символами:
[{,, ",, S,, ,, у ,, с ,, с ,, е ,, с ,, с D ,, а ,, т ,, а ,, ",,: ,," ,, ,, Т ,, я с ,,k ,, e ,, t ,, ,, n ,, o ,, t ,,, s, a ,, v ,, e, d ,,, a ,, s ,,, n ,,o ,,, c, h, a, n, g, e, s,, m, a, d, e, I, N, C, 0,, 2,, 4 ,, ",,,,," ,, Е ,, г ,, г ,, ,, о г ,, D ,, а ,, т ,, а ,, ",,: ,,п ,, у ,, л ,, л ,,,,, ",, A ,, р ,, р ,, D ,, а ,, т ,, а ,," ,,: ,, п ,, и,, l ,, l ,,},]
массив байтов содержит следующие данные:
[123, 0, 34, 0, 83, 0, 117, 0, 99, 0, 99, 0, 101, 0, 115, 0, 115, 0, 68, 0, 97, 0, 116, 0, 97, 0, 34, 0, 58, 0, 34, 0, 84, 0, 105, 0, 99, 0, 107, 0, 101, 0, 116, 0, 32, 0, 110, 0, 111, 0, 116, 0, 32, 0, 115, 0, 97, 0, 118, 0, 101, 0, 100, 0, 32, 0, 97, 0, 115, 0, 32, 0, 110, 0, 111, 0, 32, 0, 99, 0, 104, 0, 97, 0, 110, 0, 103, 0, 101, 0, 115, 0, 32, 0, 109, 0, 97, 0, 100, 0, 101, 0, 73, 0, 78, 0, 67, 0, 48, 0, 50, 0, 52, 0, 34, 0, 44, 0, 34, 0, 69, 0, 114, 0, 114, 0, 111, 0, 114, 0, 68, 0, 97, 0, 116, 0, 97, 0, 34, 0, 58, 0, 110, 0, 117, 0, 108, 0, 108, 0, 44, 0, 34, 0, 65, 0, 112, 0, 112, 0, 68, 0, 97, 0, 116, 0, 97, 0, 34, 0, 58, 0, 110, 0, 117, 0, 108, 0, 108, 0, 125, 0]
Есть идеи, как мне это исправить?Вся помощь приветствуется