REST POST works correctly with POSTMAN but exception when using Spring RestTemplate

51,988

Solution 1

You are setting the 'Accept' header, which defines which content type you will accept as a response.

Instead you must set the header 'Content-Type' with 'application/json'.

Edit:

In your java code id is a string, in the postman its a number. May be this makes the server fail?

Solution 2

Try this way

 try {
        return restTemplate.exchange(url, httpMethod, httpEntity, String.class);
     } catch(HttpStatusCodeException e) {
        return ResponseEntity.status(e.getRawStatusCode()).headers(e.getResponseHeaders())
                .body(e.getResponseBodyAsString());
     }
Share:
51,988
Rehan
Author by

Rehan

I have 9+ years of experience in Java. I have my blog - https://www.javainuse.com

Updated on January 07, 2022

Comments

  • Rehan
    Rehan over 2 years

    I am writing a Rest client to post JSON data using Spring RestTemplate. Using POSTMAN and following JSON data in body get the response correctly-

    {
        "InCode":"test",
        "Name":"This is  test",
        "Email":"[email protected]",
        "Id":18,
    }
    

    However when trying to hit the REST API using Spring RestTemplate as follows

    ResponseEntity<String> response = restTemplate.exchange(baseUrl,
                    HttpMethod.POST, getHeaders(), String.class);
    
    private HttpEntity<?> getHeaders() throws JSONException {
    JSONObject request = new JSONObject();
            request.put("Email", "[email protected]");
            request.put("Id", "18");
            request.put("Name", "This is  test");
            request.put("InCode", "test");
    
            headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
            return new HttpEntity<>(request.toString(), headers);
            }
    

    I get the exception-

    11:52:56.808 [main] DEBUG o.s.web.client.RestTemplate - Created POST request for "http://server-test/platform/v4/org"
    11:52:56.815 [main] DEBUG o.s.web.client.RestTemplate - Setting request Accept header to [text/plain, application/json, application/*+json, */*]
    12:03:47.357 [main] DEBUG o.s.web.client.RestTemplate - Writing [{"InCode":"test","Email":"[email protected]","Id":"18","Name":"This is  test"}] using [org.springframework.http.converter.StringHttpMessageConverter@6a1aab78]
    11:52:57.574 [main] DEBUG o.s.web.client.RestTemplate - POST request for "http://server-test/platform/v4/org" resulted in 500 (Internal Server Error); invoking error handler
    Exception in thread "main" org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
        at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94)
        at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641)
        at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597)
        at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557)
        at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:475)
    

    Would be thankful for any help.

    • cassiomolin
      cassiomolin almost 8 years
      Looks like your are performing a request to the base URL of your application. I think that's not what you want.
    • darshgohel
      darshgohel almost 8 years
      You can go through this Link which clearly tells when which types of error will be returned by REST. Can you give full error trace to track it down further?
    • Rehan
      Rehan almost 8 years
      The URL is correct. And this is the complete StackTrace. It only does not have the line number where it was occurring during call,
    • JS noob
      JS noob over 3 years
      Did you ever figure this out?
  • Rehan
    Rehan almost 8 years
    I did add content type but getting the same exceptiom. The service accepted both JSON and XML data. It is working with XML. Also the POSTMAN returns HTTP code 500 in some scenarios but the description is good like the data already exists at server side. But RestTemplate only gives the stacktrace as above.
  • Rami Del Toro
    Rami Del Toro about 7 years
    Thank you Stefan. This solved a icky bug that was faced. I started off posting requests to a system via WebResource (Jersey) as part of a POC. All looks fine, once I implemented the code in a project via Spring Rest Template, the other system mentioned that they are receiving an empty JSON. Long story short and trouble shooting procedures, applying headers.setContentType(MediaType.APPLICATION_JSON); resolved the issue.