Как извлечь код состояния HTTP из вызова RestTemplate в URL-адрес?
Я использую RestTemplate
чтобы сделать HTTP-вызов нашему сервису, который возвращает простой ответ JSON. Мне вообще не нужно разбирать этот JSON. Мне просто нужно вернуть то, что я получаю с этой службы.
поэтому я сопоставляю это с String.class
и возвращение фактического JSON response
как строку.
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
return response;
теперь вопрос -
Я пытаюсь извлечь HTTP Status codes
после нажатия URL. Как извлечь код состояния HTTP из вышеуказанного кода? Я нужно ли вносить какие-либо изменения в то, как я это делаю в настоящее время?
обновление:-
это то, что я пытался и я могу получить ответ и код состояния. Но мне всегда нужно установить HttpHeaders
и Entity
объект, как показано ниже, я делаю это?
RestTemplate restTemplate = new RestTemplate();
//and do I need this JSON media type for my use case?
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
//set my entity
HttpEntity<Object> entity = new HttpEntity<Object>(headers);
ResponseEntity<String> out = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
System.out.println(out.getBody());
System.out.println(out.getStatusCode());
пара вопросов-Нужно ли мне иметь MediaType.APPLICATION_JSON
поскольку я просто делаю вызов url, который возвращает ответ назад, он может вернуть JSON или XML или простой строка.
4 ответов
использовать RestTemplate#exchange(..)
методы, возвращающие ResponseEntity
. Это дает вам доступ к строке состояния и заголовки (и тело, конечно).
если вы не хотите оставлять хорошую абстракцию вокруг RestTemplate.get/postForObject...
методы позади, как я, и не любят возиться с шаблоном, необходимым при использовании RestTemplate.exchange...
(Request - and ResponseEntity, HttpHeaders и т. д.), Есть еще одна возможность получить доступ к кодам HttpStatus.
просто окружите обычный RestTemplate.get/postForObject...
С try/catch для org.springframework.web.client.HttpClientErrorException
и org.springframework.web.client.HttpServerErrorException
, например:
try {
return restTemplate.postForObject("http://your.url.here", "YourRequestObjectForPostBodyHere", YourResponse.class);
} catch (HttpClientErrorException | HttpServerErrorException httpClientOrServerExc) {
if(HttpStatus.NOT_FOUND.equals(httpClientOrServerExc.getStatusCode())) {
// your handling of "NOT FOUND" here
// e.g. throw new RuntimeException("Your Error Message here", httpClientOrServerExc);
}
else {
// your handling of other errors here
}
на org.springframework.web.client.HttpServerErrorException
добавляется здесь для ошибок с a 50x
.
теперь вы можете просто реагировать на все Статускоды, которые вы хотите - за исключением соответствующего, который соответствует вашему HTTP-методу-как GET
и 200
, который не будет обрабатываться как исключение,поскольку он является совпадающим. Но это должно быть прямо вперед, если вы реализуете / потребляете RESTful services:)
могут быть некоторые немного более сложные случаи использования, в которые кто-то может упасть (как и я). Рассмотрим следующее:
поддержка объекта страницы, чтобы использовать его с RestTemplate и ParameterizedTypeReference:
RestPageResponse:
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
public class RestResponsePage<T> extends PageImpl<T>{
private static final long serialVersionUID = 3248189030448292002L;
public RestResponsePage(List<T> content, Pageable pageable, long total) {
super(content, pageable, total);
}
public RestResponsePage(List<T> content) {
super(content);
}
public RestResponsePage() {
super(new ArrayList<T>());
}
}
используя ParameterizedTypeReference
даст следующее:
ParameterizedTypeReference<RestResponsePage<MyObject>> responseType =
new ParameterizedTypeReference<RestResponsePage<MyObject>>() {};
HttpEntity<RestResponsePage<MyObject>> response = restTemplate.exchange(oauthUrl, HttpMethod.GET, entity, responseType);
вызов #exchange:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<?> entity = new HttpEntity<>(headers);
response = restTemplate.exchange("localhost:8080/example", HttpMethod.GET, entity, responseType);
теперь вот " сложно" часть.
попытка вызвать exchange getStatusCode
будет невозможно, потому что компилятор, к сожалению, не будет знать о "предполагаемом" типе response
.
это потому, что дженерики реализуются через стирание типа, которое удаляет всю информацию о универсальных типах во время компиляции (Читать далее - Источник)
((ResponseEntity<RestResponsePage<MyObject>>) response).getStatusCode()
в этом случае, вы должны явно привести переменную к нужному классу чтобы получить statusCode
(и/или другие атрибуты)!
private RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(url,HttpMethod.GET, requestEntity,String.class);
ответ содержит "тело", "заголовки" и "statusCode"
для получения statusCode: response.getStatusCode ();