Как мне прочитать заголовок ответа из RestTemplate?

#java #spring #resttemplate

#java #spring #resttemplate

Вопрос:

Я отправляю информацию в веб-службу, используя RestTemplate.postForObject. Помимо результирующей строки мне нужна информация в заголовке ответа. Есть ли какой-либо способ получить это?

 RestTemplate template = new RestTemplate();
String result = template.postForObject(url, request, String.class);
  

Ответ №1:

Хорошо, я наконец понял это. Метод exchange — это именно то, что мне нужно. Он возвращает HttpEntity, который содержит полные заголовки.

 RestTemplate template = new RestTemplate();
HttpEntity<String> response = template.exchange(url, HttpMethod.POST, request, String.class);

String resultString = response.getBody();
HttpHeaders headers = response.getHeaders();
  

Комментарии:

1. Если вам нужен статус: ResponseEntity<?> response = template.exchange(…); response.getStatusCode();

2. Вы могли бы также вызвать ‘postForEntity’, что является немного более простым методом.

3. Единственная проблема, которую я вижу в этом, заключается в том, что метод template.exchange использует RestTemplate.getMessageConverters() для создания HttpMessageConverterExtractor для вас. Это может быть или не быть тем, что вы хотите. В большинстве случаев вам захочется использовать это и настроить конвертеры сообщений в spring-mvc-servlet.xml .

Ответ №2:

Лучшее, что можно было бы сделать, это использовать метод execute и передать в ResponseExtractor, который будет иметь доступ к заголовкам.

 private static class StringFromHeadersExtractor implements ResponseExtractor<String> {

    public String extractData(ClientHttpResponse response) throws   
    {
        return doSomthingWithHeader(response.getHeaders());
    }
}
  

Другой вариант (менее чистый) — расширить RestTemplate и переопределить вызов doExecute и добавить туда любую специальную логику обработки заголовка.

Комментарии:

1. 1, но, вероятно, лучше расширить существующий HttpMessageConverterExtractor и переопределить, а не писать совершенно новый.

2. execute хочет, чтобы RequestCallback был одним из его параметров. Я нигде не могу найти пример того, как это реализовать, чтобы содержать тело запроса. postForObject просто принимает HttpEntity, есть идеи?

Ответ №3:

   HttpEntity<?> entity = new HttpEntity<>( postObject, headers ); // for request
    HttpEntity<String> response = template.exchange(url, HttpMethod.POST, entity, String.class);
    String result= response.getBody();
    HttpHeaders headers = response.getHeaders();
  

Ответ №4:

Я не знаю, является ли это рекомендуемым методом, но, похоже, вы могли бы извлечь информацию из заголовков ответа, если вы настроите шаблон на использование пользовательского HttpMessageConverter .