Как извлечь код состояния 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 ();