Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to extract HTTP status code from the RestTemplate call to a URL?

I am using RestTemplate to make an HTTP call to our service which returns a simple JSON response. I don't need to parse that JSON at all. I just need to return whatever I am getting back from that service.

So I am mapping that to String.class and returning the actual JSON response as a string.

RestTemplate restTemplate = new RestTemplate();  String response = restTemplate.getForObject(url, String.class);  return response; 

Now the question is -

I am trying to extract HTTP Status codes after hitting the URL. How can I extract HTTP Status code from the above code? Do I need to make any change into that in the way I doing it currently?

Update:-

This is what I have tried and I am able to get the response back and status code as well. But do I always need to set HttpHeaders and Entity object like below I am doing it?

    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()); 

Couple of question - Do I need to have MediaType.APPLICATION_JSON as I am just making a call to url which returns a response back, it can return either JSON or XML or simple string.

like image 966
john Avatar asked Apr 21 '14 20:04

john


People also ask

How can I get status code from HTTP status?

To get the status code of an HTTP request made with the fetch method, access the status property on the response object. The response. status property contains the HTTP status code of the response, e.g. 200 for a successful response or 500 for a server error.

How do I find the response to a URL?

Monitoring Status Code Usage One way to do this is in Google Search Console. In the sidebar, click on Settings, then under Crawling click on “Open Report”. On the main page, you can view crawling By Response.

How do I get root URL from restTemplate?

getRootUri(); restTemplate. postForLocation(uri, request); To get this URI.


2 Answers

Use the RestTemplate#exchange(..) methods that return a ResponseEntity. This gives you access to the status line and headers (and the body obviously).

  • getStatusCode()
  • getHeaders()
like image 70
Sotirios Delimanolis Avatar answered Sep 18 '22 07:09

Sotirios Delimanolis


If you don´t want to leave the nice abstraction around RestTemplate.get/postForObject... methods behind like me and dislike to fiddle around with the boilerplate stuff needed when using RestTemplate.exchange... (Request- and ResponseEntity, HttpHeaders, etc), there´s another option to gain access to the HttpStatus codes.

Just surround the usual RestTemplate.get/postForObject... with a try/catch for org.springframework.web.client.HttpClientErrorException and org.springframework.web.client.HttpServerErrorException, like in this example:

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 } 

The org.springframework.web.client.HttpServerErrorException is added here for the errors with a 50x.

Now you´re able to simple react to all the StatusCodes you want - except the appropriate one, that matches your HTTP method - like GET and 200, which won´t be handled as exception, as it is the matching one. But this should be straight forward, if you´re implementing/consuming RESTful services :)

like image 23
jonashackt Avatar answered Sep 18 '22 07:09

jonashackt