#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
.