使用RestTemplate发送http请求,发现报错400 Bad Request,其实这是个很基础的问题,一般都能绕过去,像我这样直接复制代码才有可能发生这样的错误情况。
先上原码:
@AutowiredRestTemplate 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*/@Beanpublic RestTemplate restTemplate() {return getRestTemplate();}/*** 获取自定义 RestTemplate* @return RestTemplate*/private RestTemplate getRestTemplate() {RestTemplate restTemplate = new RestTemplateBuilder().setConnectTimeout(5 * 1000).setReadTimeout(60 * 1000).build();// 为避免汉字变成问号,将String转换器编码格式置为 UTF-8restTemplate.getMessageConverters().forEach(converter -> {if (converter instanceof StringHttpMessageConverter) {((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);}});return restTemplate;}
}