RestTemplate 解析

本文主要讲解RestTemplate 的原理,具体的使用会链接其他博文。
RestTemplate的本质就是再Http的网络请求中增加一个马甲,用户只要通过 url即可进行服务器访问,也就是RestTemplate底层只是封装了一层网络请求,这就是RestTemplate的本质所在。

  • RestTemplate是Spring提供的用于访问Rest服务的客户端,
  • RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

一、RestTemplate的各种方法的调用网上很多,请参考以下链接,每篇一样,这里就不再讲解其方法调用。

https://blog.csdn.net/itguangit/article/details/78825505

一、RestTemplate的核心之一 Http Client。
目前通过RestTemplate 的源码可知,RestTemplate 可支持多种 Http Client的http的访问,如下所示:

  1. 基于 JDK HttpURLConnection 的 SimpleClientHttpRequestFactory,默认。
  2. 基于 Apache HttpComponents Client 的 HttpComponentsClientHttpRequestFactory
  3. 基于 OkHttp3的OkHttpClientHttpRequestFactory。
  4. 基于 Netty4 的 Netty4ClientHttpRequestFactory。

    其中HttpURLConnection 和 HttpClient 为原生的网络访问类,OkHttp3采用了 OkHttp3的框架,Netty4 采用了Netty框架。

因此,如果要优化网络访问就需要选择合适的Http Client,需要根据业务的需求并需要深入了解每种Http Client的特性,OkHttp3 已经在另外博文对其进行了详解,以下将通过引入 OkHttp3来讲解RestTemplate。

  • 首先,定义一个配置文件,使用注解@Configuration,这个配置文件就是对RestTemplate的自定义。
package com.zteauto.etm.portal;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

//这里Http Client 改为了 okhttp3
@Configuration
public class RestConfig {
    @Bean
    public RestTemplate customRestTemplate(){
        OkHttp3ClientHttpRequestFactory okHttp3ClientHttpRequestFactory = new OkHttp3ClientHttpRequestFactory();
        RestTemplate restTemplate = new RestTemplate(okHttp3ClientHttpRequestFactory);
        return restTemplate;
    }
}
  • 因为RestTemplate中如果要使用okhttp3,还必须在项目中引入 okhttp3的包,配置如下:
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.10.0</version>
</dependency>
  • 引入okhttp3的包之后,则需要使用okhttp3,具体的okhttp3的使用请详见我的博文okhttp3详解系列,以下只是对 okhttp3在 spring boot中的 配置代码,通过@Configuration的注释来自定义OkhttpClient 。@Configuration的具体作用请百度。示例如下:
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;

@Configuration
public class OkHttpConfiguration {
    
    

    @Bean
    public OkHttpClient okHttpClient() {
        return new OkHttpClient.Builder()
                //.sslSocketFactory(sslSocketFactory(), x509TrustManager())
                .retryOnConnectionFailure(false)
                .connectionPool(pool())
                .connectTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30,TimeUnit.SECONDS)
                .build();
    }

    @Bean
    public X509TrustManager x509TrustManager() {
        return new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }
            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        };
    }

    @Bean
    public SSLSocketFactory sslSocketFactory() {
        try {
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        return null;
    }


    @Bean
    public ConnectionPool pool() {
        return new ConnectionPool(50, 10, TimeUnit.MINUTES);
    }
}

一、RestTemplate的核心之二 解析器 HttpMessageConverter。
RestTemplate中内置了多种解析器,包括String,Json,Object等。
自定义解析器如下,通过获取解析器列表,并把自定义的解析器注册进去即可:

RestTemplate restTemplate = new RestTemplate();
        //获取RestTemplate默认配置好的所有转换器
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        //默认的MappingJackson2HttpMessageConverter在第7个 先把它移除掉
        messageConverters.remove(6);
        //添加上GSON的转换器
        messageConverters.add(6, new GsonHttpMessageConverter());

猜你喜欢

转载自blog.csdn.net/wangqiubo2010/article/details/81708643