【问题标题】:Getting 400 Bad Request for Rest Template Spring Boot获取 400 错误的 Rest Template Spring Boot 请求
【发布时间】:2020-03-04 17:05:12
【问题描述】:

我有一个休息控制器,我试图在 Spring Boot 中使用 RestTemplate 从服务中获取令牌。当我使用 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

【问题讨论】:

  • 异常:400 错误请求:[{"error":"invalid_request","error_description":"缺少表单参数:grant_type"}]
  • 我添加了一个快速示例。试试看!
  • 请注意,您似乎在重新发明 OAuth2 客户端,通常使用预打包的库会更好; Spring 已经全面集成了作为 OAuth2 客户端或资源服务器运行的功能。

标签: java spring spring-boot


【解决方案1】:

试试这样的:

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

【讨论】:

  • 不客气。您可以将其标记为答案! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多