RestTemplate报错400 Bad Request的解决方案
目录
- RestTemplate报错400 Bad Request
- 问题所在
- 解决办法
- 方法1
- 方法2:写个config类
- 总结
RestTephpmplate报错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> ent编程客栈ity = new HttpEntity<>(body, httpHeaders);
FeishuAlarmResp result = restTemplate.postF编程客栈orObject(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 RestTemplapythonte 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(pythonStandardCharsets.UTF_8);
}
});
return restTemplate;
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
加载中,请稍侯......
精彩评论