RestTemplate

在日常项目开发中,我们调用第三方接口数据,有下面三种方法


  1. URLConnection (JDK自带)
  2. HttpClient (Apache Jakarta Common下的)
  3. RestTemplate (Spring下的)

RestTemplate有如下三个构造方法 可以分为两类

RestTemplate()
RestTemplate(List> messageConverters)
// 默认,底层实现是URLConnection 可以自定义转换器

RestTemplate(ClientHttpRequestFactory requestFactory)
//可以通过如下 ClientHttpRequestFactory的三个实现类 选择不同的底层
//1.封装URLConnection
SimpleClientHttpRequestFactory implements ClientHttpRequestFactory
//2.封装HttpClient
HttpComponentsClientHttpRequestFactory implements ClientHttpRequestFactory
//3.封装OKHttp
OkHttp3ClientHttpRequestFactory implements ClientHttpRequestFactory
//我们常用RestTemplate 结合HttpClient来使用(也就是选择第2个),如下
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);

HttpComponentsClientHttpRequestFactory 构造器

// 构造器1 HttpComponentsClientHttpRequestFactory()  会通过如下方法生成默认的httpClient
HttpClient httpClient = HttpClientBuilder.create()
                .useSystemProperties()
                .build();

//构造器2 HttpComponentsClientHttpRequestFactory(HttpClient httpClient) 需要我们也是通过如下方法传入httpClient
HttpClient httpClient = HttpClientBuilder.create()
                .useSystemProperties()
                .build();

// 但是如果我们选择构造器2可以顺便改变该httpClient的配置,connectionManager 和requestConfig
 HttpClient httpClient = HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig)
                .setConnectionManager(connectionManager)
                .build();

自定义连接池配置

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
// 连接池总线程数
        connectionManager.setMaxTotal(100);
// 单个IP可以从连接池获取的最多连接数,防止一个IP把连接池的连接全部占用
        connectionManager.setDefaultMaxPerRoute(10);
// 暂时还不清楚这个值的意思
        connectionManager.setValidateAfterInactivity(50);

自定义超时配置

RequestConfig requestConfig = RequestConfig.custom()
// 建立连接之后,等待远程服务器返回数据的时间,也就是两个数据包(请求包和响应包)之间不活动的最大时间,超过断开SocketTimeOutException
                .setSocketTimeout(50)
// 指客户端和服务器建立连接的timeout,超过50ms断开ConnectionTimeOutException
                .setConnectTimeout(50)
// 指从连接池获取连接的耗时,超过50ms断开ConnectionRequestTimeoutOutException
                .setConnectionRequestTimeout(50)
                .build();

你可能感兴趣的:(RestTemplate)