SpringBoot HTTP请求超时、请求返回乱码的解决办法

在请求第三方接口的时候,有些第三方请求会出现请求超时的情况,还会出现请求返回的结果会有乱码的现象。

我最开始的做法是:(构造函数的方法自行百度,都可以解决问题的)

    /**
     * 设置连接超时
     */
    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

你可能感兴趣的:(BUG处理)