Spring Framework 3.2.5 - Ошибка при декодировании тела ответа для вывода POST API - PullRequest
0 голосов
/ 15 октября 2018

Я просто потратил 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]

Есть идеи, как мне это исправить?Вся помощь приветствуется

1 Ответ

0 голосов
/ 16 октября 2018

Работает изменение типа ResponseEntity с String на Object.Код:

ResponseEntity<Object> entity = restTemplate.exchange(url, HttpMethod.POST, request, Object.class);

Спасибо @HadiJ за указание в правильном направлении.

...