У меня есть класс с именем 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()
.