Tarun Pande
Tarun Pande

Reputation: 401

Getting 400 Bad Request for Rest Template Spring Boot

I have a rest Controller where i am trying to get the Token from a service using the RestTemplate in Spring Boot. The application works fine when i use Postman but from Java Application i get 400 Bad Request.

My Java Sample :

@PostMapping("/service")
private String generateAuthenticationToken() {

    HttpHeaders authenticationTokenHeaders = new HttpHeaders();
    authenticationTokenHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

    JSONObject sfmcBUCredential = new JSONObject();
    JSONObject sfmcTokenResponseObject;
    sfmcBUCredential.put("grant_type", sfmcConfig.getGrant_type());
    sfmcBUCredential.put("client_id", sfmcConfig.getClient_id());
    sfmcBUCredential.put("client_secret", sfmcConfig.getClient_secret());

    String sfmcBUCredentialString = sfmcBUCredential.toString();

    System.out.println("Values before sending to POST Request are :::" + sfmcBUCredentialString);

    HttpEntity<String> getTokenEntity = new HttpEntity<>(sfmcBUCredentialString, authenticationTokenHeaders);
    System.out.println("Values after sending to POST Request are :::" + getTokenEntity.toString());
    System.out.println("URL is :::" + GET_SFMC_ENDPOINT_URL);

    //String tokenResponse = restTemplate.postForObject(GET_SFMC_ENDPOINT_URL, getTokenEntity, String.class);
    ResponseEntity<String> tokenResponse = restTemplate.exchange(GET_SFMC_ENDPOINT_URL, HttpMethod.POST, getTokenEntity, String.class);

    sfmcTokenResponseObject = new JSONObject(tokenResponse.getBody());
    System.out.println("tokenResponse::::::::" + sfmcTokenResponseObject.getString("access_token").toString());
    return sfmcTokenResponseObject.getString("access_token");

}

Logs :

Values before sending to POST Request are :::{"grant_type":"client_credentials","client_secret":"c1ae4b4a-498e-46a0-a02e-cd2378cb8db6","client_id":"Y43iLAhr4e0SoJ9KkV4vLKnGhNmS1Y3c"}
Values after sending to POST Request are :::<{"grant_type":"client_credentials","client_secret":"c1ae4b4a-498e-46a0-a02e-cd2378cb8db6","client_id":"Y43iLAhr4e0SoJ9KkV4vLKnGhNmS1Y3c"},[Content-Type:"application/x-www-form-urlencoded"]>
URL is :::https://keycloak.lab.hci.aetna.com/auth/realms/master/protocol/openid-connect/token

Upvotes: 2

Views: 7184

Answers (2)

pbthorste
pbthorste

Reputation: 468

I had the same issue with rest template and the GET method on an Amazon ALB.

It turns out that rest template was adding the header Content-Length: 0 to the request.

This caused the ALB to reject the request with a 400 error.

Unfortunately, I am not sure how to remove the header from the request if it is set to zero. Using interceptors does not seem to work.

Upvotes: 0

Anand Varkey Philips
Anand Varkey Philips

Reputation: 2075

Try something like this:

RestTemplate restTemplate = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("grant_type", sfmcConfig.getGrant_type());
map.add("client_id", sfmcConfig.getClient_id());
map.add("client_secret", sfmcConfig.getClient_secret());

HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(map, headers);

ResponseEntity<LabelCreationResponse> response =
    restTemplate.exchange("url",
                          HttpMethod.POST,
                          entity,
                          String.class);

Upvotes: 3

Related Questions