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; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。