在请求第三方接口的时候,有些第三方请求会出现请求超时的情况,还会出现请求返回的结果会有乱码的现象。
我最开始的做法是:(构造函数的方法自行百度,都可以解决问题的)
/**
* 设置连接超时
*/
static {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(20000);
requestFactory.setReadTimeout(20000);
restTemplate = new RestTemplate(requestFactory);
reInitMessageConverter(restTemplate);
}
/**
* 添加一个字符集为UTF-8的StringHttpMessageConvert
* @param restTemplate
*/
private static void reInitMessageConverter(RestTemplate restTemplate){
List> converterList=restTemplate.getMessageConverters();
HttpMessageConverter> converterTarget = null;
for (HttpMessageConverter> item : converterList) {
if (item.getClass() == StringHttpMessageConverter.class) {
converterTarget = item;
break;
}
}
if (converterTarget != null) {
converterList.remove(converterTarget);
}
HttpMessageConverter> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converterList.add(converter);
}
然鹅,我这么写被同事吐槽了......被吐槽了......卧槽。同事让我不管用什么方法,把这一大串代码解决掉,不要写在这里,写这么多很low......没办法,谁让我菜呢,还是个新来的。只能照做了......
百度了一些方法,都没用,乱码问题没解决。
比如:配置文件配置http请求和响应编码(然鹅,并没有什么卵用......)
spring:
http:
encoding:
charset: UTF-8
enabled: true
force-response: true
再比如:(还是没有什么卵用......)
@Bean
@ConditionalOnMissingBean(CharacterEncodingFilter.class)
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
再比如:在controller上面注解(仍然的,然并卵......)
@RequestMapping(value = "/demo", produces = {"application/json;charset=UTF-8"})
.......等等,很多百度的方法,并不能解决我的这个问题~
最后,大招来了!!!!(ps:我觉得是大招~哈哈)
我就想着,可不可以将RestTemplate交给spring来做管理,注入到请求的类里面去,在springboot启动类启动的时候,就把请求时间和编码设置进去。
想到了就开始做,不然咋知道这个方法OK不OK呢,是吧~
自测之后,妥妥的,解决问题。
最后,上代码,记录我的成就感~~~~哈哈O(∩_∩)O
@Bean
public RestTemplate reRestTemplate(){
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(20000);
requestFactory.setReadTimeout(20000);
RestTemplate restTemplate = new RestTemplate(requestFactory);
List> converterList=restTemplate.getMessageConverters();
HttpMessageConverter> converterTarget = null;
for (HttpMessageConverter> item : converterList) {
if (item.getClass() == StringHttpMessageConverter.class) {
converterTarget = item;
break;
}
}
if (converterTarget != null) {
converterList.remove(converterTarget);
}
HttpMessageConverter> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
converterList.add(converter);
return restTemplate;
}
@Autowired
private RestTemplate restTemplate;
将RestTemplate交给spring管理后,就可以自动注入RestTemplate了,通常我们用RestTemplate就是需要new,这个方法倒是方便,谁用就直接注入就可以用了,不需要每个类都去new一个RestTemplate。我觉得这是我知道的最好的办法了~~~
对于springboot,我是边学边写,如果有大佬有更好的建议,欢迎指点~O(∩_∩)O