【问题标题】:Bad request with RestTemplate -> postForObject (Spring Boot)RestTemplate 的错误请求-> postForObject (Spring Boot)
【发布时间】:2021-03-22 13:21:42
【问题描述】:

我在一件简单的事情上遇到了一些麻烦。

我正在尝试向其他 REST 服务发送请求

//getting restTemplate from RestTemplateBuilder.build()
//endpoint and rest of variables came in properties

Map<String, String> map = new HashMap<>();
map.put("app", app);
map.put("username", username);
map.put("password", password);
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

String token = restTemplate.postForObject(loginEndpoint, headers, String.class, map);

我收到了:

Unexpected error occurred in scheduled task.

org.springframework.web.client.HttpClientErrorException: 400 Bad Request

奇怪的是,当我使用简单的 CURL 调用并且工作顺利时。

已经检查了变量和端点,是正确的。

【问题讨论】:

  • 您的端点期望什么?
  • 基本上:{{authUrl}}?app={{app}}&password={{password}}&username={{user}} 只需 3 个参数,我得到一个字符串作为响应。跨度>
  • 您的 loginEndpoint 是否有适当的占位符?
  • 您传递给 postForObject 的 map 参数是用来填充 uri 字符串中的占位符。
  • 进行开关,它工作正常。谢谢

标签: java spring-resttemplate


【解决方案1】:

在这种情况下,端点必须在端点 url 上有适当的占位符。

我用这个方法做起来很简单:

private String placeHolders(Map<String, String> values){
    String response = "?";
    boolean first = true;
    for(Map.Entry<String, String> entry:values.entrySet()){
        if(first){
            first = false;
        }else{
            response+="&";
        }
        response+=entry.getKey()+"="+entry.getValue();
    }
    return response;
}

现在的电话是:

String token = restTemplate.postForObject(loginEndpoint+placeHolders, headers, String.class, map);

【讨论】:

  • 请使用Spring的UriComponentsBuilder以正确的方式生成URI。
猜你喜欢
  • 1970-01-01
  • 2014-12-28
  • 2019-03-20
  • 2019-01-21
  • 1970-01-01
  • 2019-03-20
  • 2019-05-19
  • 2020-04-07
  • 2021-07-26
相关资源
最近更新 更多