【问题标题】:HttpClientErrorException$BadRequest: 400 null with RestTemplate 2.1.4.RELEASEHttpClientErrorException$BadRequest: 400 null with RestTemplate 2.1.4.RELEASE
【发布时间】:2019-09-15 05:39:08
【问题描述】:

我有一个 SpringBoot 2.1.4.RELEASE 应用程序。使用第三方 API。 使用 Postman 版本 6.7.4。

我使用此 URL 进行身份验证:

https://bonanza.com:7688/pecador/api/v1/auth 并在正文中:{ "username": "nunito.calzada@gmail.com","password": "sdfhhskj$(I$" }

而且效果很好

我已经实现了这个方法:

protected String authToken (Authentication auth) {

        // Request Header
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Accept", "application/json");

        // Request Body
        MultiValueMap<String, String> parametersMap = new LinkedMultiValueMap<String, String>();
        parametersMap.add("username", auth.getName());
        parametersMap.add("password", (String)auth.getCredentials());

        // Request Entity
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(parametersMap, headers);

        // RestTemplate
        RestTemplate restTemplate = new RestTemplate();

        // POST Login
        ResponseEntity<String> response = restTemplate.exchange("https://bonanza.com:7688/pecador/api/v1/auth", HttpMethod.POST, requestEntity, String.class);

        HttpHeaders responseHeaders = response.getHeaders();

        List<String> list = responseHeaders.get("Authorization");
        return list == null || list.isEmpty() ? null : list.get(0);
    }

但我有这个错误:

2019-04-25 19:55  [http-nio-2233-exec-2] ERROR i.i.w.a.e.RestResponseEntityExceptionHandler.handleInternal(95) - 500 Status Code
org.springframework.web.client.HttpClientErrorException$BadRequest: 400 null
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:79)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:579)

我还尝试用"nunito.calzada@gmail.com"(String)auth.getCredentials()"sdfhhskj$(I$" 重复auth.getName(),结果相同

使用 Postman 进行测试,我在 header 中设置了 Content-Type: application/json:

我也试过这段代码,结果相同:

HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("Accept", "application/json"); 

        //Request Body 
        MultiValueMap<String, String> parametersMap = new LinkedMultiValueMap<String, String>(); 


          parametersMap.add("username", "ricard.olle@gmail.com");
          parametersMap.add("password", "Iconofcoil100@");


          HttpEntity<?> httpEntity = new HttpEntity<Object>(parametersMap, headers);

          RestTemplate restTemplate = new RestTemplate();

          ResponseEntity<String> response =
                  restTemplate.exchange( BASE_API_URL + "auth", HttpMethod.POST, httpEntity,String.class);


          HttpHeaders responseHeaders = response.getHeaders();

          List<String> list = responseHeaders.get("Authorization"); 

          return list == null || list.isEmpty() ? null : list.get(0);

【问题讨论】:

  • 您是否尝试将auth.getName() 替换为"nunito.calzada@gmail.com"(String)auth.getCredentials() 替换为"sdfhhskj$(I$"
  • 似乎是 HTTP 标头问题。你能检查一下邮递员在你的成功请求中发送了什么标题吗?你可以试试headers.add("Accept", "application/json");chck 是否可行?
  • 你试过api.bonanza.com吗? api.bonanza.com/docs/examples/java
  • 你能发布你的 pom 文件吗?

标签: spring rest spring-boot resttemplate restful-authentication


【解决方案1】:

这个怎么样?

    protected String authToken (Authentication auth) {
        Map<String, String> body = Map.of(
                "username", auth.getName(),
                "password", (String)auth.getCredentials());

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.postForEntity("https://bonanza.com:7688/pecador/api/v1/auth", body, String.class);
        HttpHeaders responseHeaders = response.getHeaders();

        List<String> list = responseHeaders.get("Authorization");
        return list == null || list.isEmpty() ? null : list.get(0);
    }

【讨论】:

  • 我得到这个编译错误:(String, String, String, String) 的方法是未定义的类型 Map
  • 此 API 仅适用于 Java 9+。如果您使用的是 Java 8,则可以使用 Guava 中的 ImmutableMap.of
  • 好的,我改了,但我得到了同样的错误:org.springframework.web.client.HttpClientErrorException$UnsupportedMediaType: 415 null
  • 这意味着您的 API 服务器 https://bonanza.com:7688 拒绝 Content-type: application/json 有效负载。你确定合同吗?你在用 Postman 测试的时候,有没有把 Content-Type: application/json 放在 header 里?
【解决方案2】:

您的线路:

// Request Entity
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(parametersMap, headers);

错了。 只需要做:

HttpEntity<?> httpEntity = new HttpEntity<Object>(parametersMap, requestHeaders);

因为parametersMap 是一个MultiValueMap,但是您还声明了HttpEntity 类型为MultiValueMap,在这种情况下是不正确的。

编辑:

好的,MultiValueMap 适用于“MediaType.APPLICATION_FORM_URLENCODED”的请愿书。您的案例是“MediaType.APPLICATION_JSON”。 您可以创建一个包含用户名和密码的对象并发送此对象。 例如:

public class ObjectRequest {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

然后:

ObjectRequest obr = new ObjectRequest();
obr.setUsername("nunito.calzada@gmail.com");
obr.setPassword("sdfhhskj$(I$");

并将这个对象作为对象放在HttpEntity中:

HttpEntity<ObjectRequest> requestEntity = new HttpEntity<ObjectRequest>(obr, headers);

这将自动将对象转换为 json。

【讨论】:

  • 我已经尝试过提出的解决方案,结果相同:(
  • @NuñitodelaCalzada 抱歉,我认为问题出在 MediaType,请查看编辑。
猜你喜欢
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多