本文主要讲解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的访问,如下所示:
- 基于 JDK HttpURLConnection 的 SimpleClientHttpRequestFactory,默认。
- 基于 Apache HttpComponents Client 的 HttpComponentsClientHttpRequestFactory
- 基于 OkHttp3的OkHttpClientHttpRequestFactory。
基于 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());