首页 > 解决方案 > 获取 Rest Template Spring Boot 的 400 错误请求

问题描述

我有一个休息控制器,我正在尝试使用RestTemplateSpring Boot 从服务中获取令牌。当我使用 Postman 时,该应用程序工作正常,但从 Java 应用程序我得到400 Bad Request

我的 Java 示例:

@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");

}

日志:

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

标签: javaspringspring-boot

解决方案


尝试这样的事情:

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

推荐阅读