java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > RestTemplate报错400 Bad Request

RestTemplate报错400 Bad Request的解决方案

作者:夏诗曼CharmaineXia

在使用Spring Boot时,若直接通过@Autowired注入RestTemplate可能会遇到400BadRequest错误,原因在于Spring Boot官方文档指出,由于RestTemplate实例通常需要在使用前进行定制,因此Spring Boot不会自动配置单个RestTemplate Bean

RestTemplate报错400 Bad Request

使用RestTemplate发送http请求,发现报错400 Bad Request,其实这是个很基础的问题,一般都能绕过去,像我这样直接复制代码才有可能发生这样的错误情况。

先上原码:

    @Autowired
    RestTemplate restTemplate;

    public boolean alarm(String url,String body) {
            if (body == null || url == null) {
                return false;
            }
        try {
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.add(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());

            HttpEntity<String> entity = new HttpEntity<>(body, httpHeaders);
            FeishuAlarmResp result = restTemplate.postForObject(url, entity, FeishuAlarmResp.class);
            if (result == null || result.getStatusCode() == null || result.getStatusCode() != 0) {
                log.error("http发送失败>>>>>>result={} message={}",JSON.toJSONString(result),body);
                return false;
            }
        } catch (Throwable t) {
            log.error("http发送异常:url:" + url + ",body:" + body, t);
            return false;
        }
        return true;
    }

直接报错:

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

问题所在

不能直接使用 @Autowired 自动注入 RestTemplate 使用。

因为,官网文档有写:

Since RestTemplate instances often need to be customized before being used, Spring Boot does not provide any single auto-configured RestTemplate bean.

(由于RestTemplate实例在使用前通常需要定制,Spring Boot不提供任何单个自动配置的RestTemplate bean。)

解决办法

自定义RestTemplate的Bean对象,重点是要用restTemplateBuilder.build()来创建对象。

方法1

@Autowired
private RestTemplateBuilder restTemplateBuilder;
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate() {
    return restTemplateBuilder.build();
}

//调用方式:
String baiduHtml = restTemplate.getForObject("https://www.baidu.com", String.class);
System.out.println(baiduHtml);

方法2:写个config类

然后就可以用 @Autowired 自动注入 RestTemplate 使用了。

@Component
public class RestTemplateConfig {


    /**
     * RestTemplate
     * @return RestTemplate
     */
    @Bean
    public RestTemplate restTemplate() {
        return getRestTemplate();
    }

    /**
     * 获取自定义 RestTemplate
     * @return RestTemplate
     */
    private RestTemplate getRestTemplate() {
        RestTemplate restTemplate = new RestTemplateBuilder()
                .setConnectTimeout(5 * 1000)
                .setReadTimeout(60 * 1000)
                .build();
        // 为避免汉字变成问号,将String转换器编码格式置为 UTF-8
        restTemplate.getMessageConverters().forEach(converter -> {
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        });
        return restTemplate;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文