Почему мой пользовательский ClientHttpRequestInterceptor с пустым ответом

Я сделал следующее для своего пользовательского перехватчика регистрации

public class HttpLoggingInterceptor implements ClientHttpRequestInterceptor {
    private final static Logger log = LoggerFactory.getLogger(HttpLoggingInterceptor.class);

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        logRequest(request, body);
        ClientHttpResponse response = execution.execute(request, body);
        logResponse(response);
        return response;
    }

    private void logRequest(HttpRequest request, byte[] body) throws IOException {
        log.info("Request URI : {}, Method : {}, Headers : {}, Request body : {}", request.getURI(), request.getMethod(), request.getHeaders(), new String(body, "UTF-8"));

    }

    private void logResponse(ClientHttpResponse response) throws IOException {
        log.info("Response Status code : {}, Status text : {}, Headers : {}, Response body: {}", response.getStatusCode(), response.getStatusText(), response.getHeaders(), StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
    }
}

И я устанавливаю перехватчик на restTemplate

   @Autowired
    public RestTemplate restTemplate;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        List<ClientHttpRequestInterceptor> clientHttpRequestInterceptors = new ArrayList<>();
        clientHttpRequestInterceptors.add(new HttpLoggingInterceptor());
//        clientHttpRequestInterceptors.addAll(restTemplate.getInterceptors());
        restTemplate.setInterceptors(clientHttpRequestInterceptors);
//        restTemplate.setInterceptors(Collections.singletonList(new HttpLoggingInterceptor()));
}

Регистратор правильно печатает ответ на консоль, но в конце ответ возвращается пустым вызывающей стороне. Я не могу отладить и разобраться.

Я понял, что StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()) читает поток ввода один раз, и он больше не удерживает в нем тело ответа ( который сейчас пуст)

Кто-нибудь еще сталкивался с той же проблемой и имеет идею дублировать InputStream, не читая его из исходного InputStream?

4 голоса | спросил maya16 25 PMpWed, 25 Apr 2018 16:32:57 +030032Wednesday 2018, 16:32:57

1 ответ


0
Поскольку нет входной поток может потребляться только один раз и нет ---- +: = 0 = + ---- или ---- +: = 1 = + ---- функция доступна ---- +: = 2 =: + ---- .Существует только один способ прочитать ответ несколько раз, создав restTemplate следующим образом.И ---- +: = 4 =: + ---- можно записать так}
ответил maya16 27 AMpFri, 27 Apr 2018 06:16:43 +030016Friday 2018, 06:16:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132