RestTemplate如何設置具體的實現,設置防止亂碼,設置超時時間

背景

首次接觸到 RestTemplate,是在SpringCloud的項目中。模塊之間的調用走http協議,形式上有兩種寫法,其中一種是通過RestTemplate調用微服務其他模塊的接口,另一種方式是推薦的更加簡潔的使用feign相關的註解

這個 RestTemplate 其實可以替代很多http的工具,常見的有okHttp,httpComponent(httpclient),JDK自帶的java.net.HttpURLConnection

使用

類依賴jar包,來自 spring-boot-starter-web 中的 org.springframework:spring-web

  • 要使用先new,比如直接 RestTemplate restTemplate = new RestTemplate() 後即可使用
  • 或者使用 @Bean,複用這個。RestTemplate 是線程安全的。
@Bean
RestTemplate restTemplate() {
    return new RestTemplate();
}
進階使用以及設置請求的具體實現

所謂 “請求的具體實現” 是指RestTemplate的具體的實現方式可以是JDK自帶的java.net.HttpURLConnection,也可以是apache的HTTPComponents,還可以是OkHttp。

默認情況下是JDK的實現,用於處理髮出的http請求。如何修改?

看下面的例子,設置requestfactory即可

package com.wyf.test.resttemplatetest.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;

/**
 * RestTemplate 的配置類
 *
 * @author Stone
 * @version V1.0.0
 * @date 2019/12/16
 */
@Configuration
public class RestTemplateConfig {
    /**
     * 【版本1】不建議使用這個
     * 1、readTimeout和connectTimeout默認都不超時
     * 2、處理請求的底層類是:java.net.HttpURLConnection
     *
     * @return
     */
    @Primary
    @Bean("restTemplate")
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        return setStingHttpMessageConverterEncoding(restTemplate);
    }

    /**
     * 【版本2】
     * 1、設置了超時時間(當然也可以設置永不超時,setReadTimeout=0則永不超時)
     * 2、設置了處理請求的底層類(java.net.HttpURLConnection、HTTPComponents、OkHttp)
     *
     * @return
     */
    @Bean("restTemplateWithConfig")
    public RestTemplate restTemplateWithConfig() {
        // 要用哪個具體實現就設置哪個ClientHttpRequestFactory

        // JDK的java.net.HttpURLConnection(直接new RestTemplate() 默認的實現方式)
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(5000);


        // Http Client(Http Component),必須導入對應GAV
//        HttpComponentsClientHttpRequestFactory factory2 = new HttpComponentsClientHttpRequestFactory();
//        factory2.setConnectTimeout(15000);
//        factory2.setReadTimeout(5000);

        // OKHttp3,必須導入對應GAV
//        OkHttp3ClientHttpRequestFactory factory3 = new OkHttp3ClientHttpRequestFactory();
//        factory3.setConnectTimeout(15000);
//        factory3.setReadTimeout(5000);

        RestTemplate restTemplateWithConfig = new RestTemplate(factory);
        return setStingHttpMessageConverterEncoding(restTemplateWithConfig);
    }


    /**
     * 設置 StringHttpMessageConverter 爲 UTF-8編碼
     *
     * @param restTemplate
     * @return
     */
    private RestTemplate setStingHttpMessageConverterEncoding(RestTemplate restTemplate) {
        List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
        if (converterList != null) {
            Iterator<HttpMessageConverter<?>> itr = converterList.iterator();
            while (itr.hasNext()) {
                HttpMessageConverter<?> httpMessageConverter = itr.next();
                if (httpMessageConverter instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName("UTF-8"));
                }
            }
        }
        return restTemplate;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章