Как узнать длину содержимого тела ответа, не используя response.getBody () или параметр заголовка Content-length? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть класс с именем GenericServiceImpl, который выполняет метод restTemplateGeneric.exchange() (где restTemplateGeneric является RestTemplate объектом), а другой класс с именем ServiceApiInterceptor расширяется от ClientHttpRequestInterceptor.

. конфигурация restTemplate выглядит следующим образом:

public RestTemplate restTemplateGeneric() {
        RestTemplate restTemplate = new RestTemplate();
        List<ClientHttpRequestInterceptor> chri = new ArrayList<>();
        chri.add(new RequestResponseLoggingInterceptor());
        chri.add(new BasicAuthorizationInterceptor(this.parameterConfigApi.getSecurementUsername(),
                this.parameterConfigApi.getSecurementPassword()));
        restTemplate.setInterceptors(chri);
        restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(getComponentsClientHttpRequestFactory()));
        return restTemplate;
    }

private HttpComponentsClientHttpRequestFactory getComponentsClientHttpRequestFactory() {
            return super.exHttpComponentsClientRequestFactory(parameterConfigApi);
    }

Цель класса ServiceApiInterceptor - перехватить запрос (PUT, DELETE, POST, GET) для регистрации информация о запросе и ответе.

    private void traceResponse(ClientHttpResponse response) throws IOException {
        StringBuilder inputStringBuilder = new StringBuilder();
        HttpHeaders httpHeaders = response.getHeaders();
        long longitud = httpHeaders.getContentLength();

        System.out.println("LONGITUD DEL CONTENIDO DEL RESPONSE..........:"+longitud);

        try (
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(response.getBody(), DEFAULT_ENCODING));
        ){
            String line = bufferedReader.readLine();
            while (line != null) {
                inputStringBuilder.append(line);
                inputStringBuilder.append(NEXT_LINE);
                line = bufferedReader.readLine();
            }
        } catch (IOException e) {
            log.error("Error reading service response", e);
        }

        StringBuilder logBuilder = new StringBuilder();
        logBuilder.append(RESPONSE_LAYER).append(NEXT_LINE);
        logBuilder.append(STATUS_CODE_LAYER).append(response.getStatusCode()).append(NEXT_LINE);
        logBuilder.append(STATUS_TEXT_LAYER).append(response.getStatusText()).append(NEXT_LINE);
        logBuilder.append(HEADERS_LAYER).append(response.getHeaders()).append(NEXT_LINE);
        logBuilder.append(RESPONSE_BODY_LAYER).append(inputStringBuilder.toString()).append(NEXT_LINE);
        logBuilder.append(SEPARATOR);

        log.info(logBuilder.toString());
    }

Проблема в том, что когда я выполняю запрос PUT, тело ответа ничего не возвращает, я имею в виду, что тело не null, но есть нечего читать Для этой ситуации, когда я пытаюсь прочитать тело ответа, чтобы показать в журнале, код броска и EOFException. Я углубляюсь в метод reponse.getBody() объекта ClientHttpResponse, и это происходит потому, что тело не имеет содержимого для чтения, я имею в виду, что тело не пустое, а пустое, читать нечего.

ошибка throwed относится к классу java.util.zip.GZIPInputStream при начале чтения тела, то есть объекта InputStream.

/*
     * Reads unsigned byte.
     */
    private int readUByte(InputStream in) throws IOException {
        int b = in.read();
        if (b == -1) {
            throw new EOFException();
        }
        if (b < -1 || b > 255) {
            // Report on this.in, not argument in; see read{Header, Trailer}.
            throw new IOException(this.in.getClass().getName()
                + ".read() returned value out of range -1..255: " + b);
        }
        return b;
    }

Другая проблема заключается в том, что ответ заголовка настроен на передачу кодирование информации, когда я просматриваю заголовок ответа, я вижу следующую конфигурацию:

Transfer-Encoding=[chunked]

, из-за этого параметр content-length заголовка ответа всегда возвращает - 1: (Я провожу исследование и нахожу эту ссылку об этом ответе Длина содержимого всегда отрицательна )

первый запрос GET, а второй POST запрос

[13/02/20 19:00:05:484 COT] 00000111 SystemOut     O LONGITUD DEL CONTENIDO DEL REQUEST..........:0
[13/02/20 19:00:06:125 COT] 00000111 SystemOut     O LONGITUD DEL CONTENIDO DEL RESPONSE..........:-1
---------------------------------------------------------------------------------------------------------
[13/02/20 19:00:06:188 COT] 00000111 SystemOut     O LONGITUD DEL CONTENIDO DEL REQUEST..........:179
[13/02/20 19:00:06:880 COT] 00000111 SystemOut     O LONGITUD DEL CONTENIDO DEL RESPONSE..........:-1

Буду очень признателен, если вы поможете мне найти другой способ узнать длину тела контента без использования параметра заголовка content-length и метода response.getBody().

...