как обрабатывать Transfer-Encoding=chunked в SI HttpRequestExecutingMessageHandler

Я вызываю внешний сервер, используя HttpRequestExecutingMessageHandler. Я использую преобразователь JSON в объект для преобразования данных JSON. Но я получаю следующее исключение.

Вызвано: com.fasterxml.jackson.core.JsonParseException: недопустимый символ ((CTRL-CHAR, код 31)): допускается только обычный пробел (\r, \n, \t) между токенами в [Источник: (String )�

когда я проверил заголовки, я нашел следующее. Transfer-Encoding=chunked

Является ли это причиной журнала исключений?

Исходящий шлюз и JsonToObjectTransformer приведены ниже:

    @ServiceActivator(inputChannel = "channelOutboundRequest")
    @Bean
    public HttpRequestExecutingMessageHandler outboundGateway() {
        final HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
                endpoint);
        handler.setExpectedResponseType(String.class);
        handler.setHttpMethod(HttpMethod.POST);
        handler.setOutputChannelName("channelResponse");
        handler.setAdviceChain(Collections.singletonList(advice()));
        return handler;
    }
    @Bean
    @Transformer(inputChannel = "channelResponse", outputChannel = "channelReply")
    public JsonToObjectTransformer transformer(ObjectMapper objectMapper) {
        final JsonObjectMapper<?, ?> mapper = new Jackson2JsonObjectMapper(objectMapper);
        return new JsonToObjectTransformer(DetailsDTO.class, mapper);
    }

Если заголовок вызывает проблему, как я могу обработать ответ?

Примечание. Если я попаду на внешний сервер напрямую с помощью почтальона, я получу ответ в формате JSON.

Я понятия не имею, что здесь не так. Если я использую простой вызов retemplate, как показано ниже, он работает правильно.

JSONObject jsonObject = new JSONObject("{\"code\":\"F001\",\"transactionId\":\"1008566223232\"}");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth("token");
        HttpEntity<String> request = 
                  new HttpEntity<String>(jsonObject.toString(), headers);
        String respns = restTemplt.postForObject("http://endpoint", request, String.class);
        System.out.println(respns);
        JSONObject response = new JSONObject(respns);

Одно отличие, которое я смог найти, было в заголовках ответов. они приведены ниже:

Заголовки ответа исходящего шлюза: – {Transfer-Encoding=chunked, http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@d8b195e, Server=nginx , Accept=/, Connection=keep-alive, User-Agent=PostmanRuntime/7.28.0, Host=localhost:8901, Accept-Encoding=gzip, deflate, br . -Encoding=gzip, http_requestUrl=http://inboundurl, id=be07fc8d-d478-5fa9-33e4-61a2b5f92468, Content-Length=207, contentType=application/json;charset=utf-8, Content-Type=application/json , запрос от = CUSTOM_HEADER, отметка времени = 1622533092827}

Обычный заголовок ответа на вызов restTemplate [Server:nginx, Date:Tue, 01 Jun 2021 07:34:54 GMT, Content-Type:application/json; charset = utf-8, Content-Length: 4105, Connection: keep-alive, Access-Control-Allow-Origin: *, Content-Security-Policy: default-src 'self'; base-uri 'self'; block- все-смешанный-контент; font-src 'self' https: data:;frame-предки 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src -attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests, X-DNS-Prefetch-Control:off, Expect-CT:max-age=0, X-Frame- Опции: SAMEORIGIN, Strict-Transport-Security: max-age=15552000; includeSubDomains, X-Download-Options: noopen, X-Content-Type-Options: nosniff, X-Permitted-Cross-Domain-Policies: none, Referrer-Policy: no-referrer, X-XSS-Protection: 0, ETag: W/1009-llD9DqxYkEsjyikWajYk+16cb1k]

Кто-нибудь может помочь?


person Sanal M    schedule 31.05.2021    source источник


Ответы (1)


После многих проб и ошибок я нашел причину этого. Accept-Encoding=gzip, deflate, br этот заголовок в запросе исходящего шлюза является основной причиной. ответ, который я получаю, представляет собой длинную строку, и она сжимается из-за этого заголовка. я добавил фильтр заголовка перед исходящим шлюзом, чтобы удалить этот заголовок.

    @Bean
    @Transformer(inputChannel = "channelHeaderFilterReq", outputChannel = "channelHeaderFilterRes")
    public HeaderFilter filter() {
        return new HeaderFilter("Accept-Encoding");
    }

Теперь все работает нормально..!!

person Sanal M    schedule 02.06.2021