使用HttpClient4来构建Spring RestTemplate
来源:互联网 发布:淘宝食品没有证能卖不 编辑:程序博客网 时间:2024/06/05 23:48
Spring RestTemplate简单说明
现在REST服务已经很普及了,在我们的程序中,经常会需要调用REST API,这时候会有很多选择,原始一点的JDK自带的,再进一步点使用HttpClient,或者说如果我们使用Jersey这种框架的话,也会自带rest client。但是我们项目使用的SpringMVC,所以直接使用RestTemplate。使用RestTemplate比直接使用Httpclient简单很多,同时也可以借助httpclient来实现RestTemplate。
通过使用RestTemplate仅仅只需要写几行代码,就可以完成直接使用httpclient很多行代码的事情,具体见:https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate
RestTemplate有三个构造函数:
- 默认构造函数,默认使用SimpleClientHttpRequestFactory,使用JDK自带的java.net包进行网络传输。
- public RestTemplate(ClientHttpRequestFactory requestFactory)。传入一个ClientHttpRequestFactory,ClientHttpRequestFactory在Spring中的实现有很多个,如HttpComponentsClientHttpRequestFactory,Netty4ClientHttpRequestFactory等,具体的可以看代码,这里只介绍HttpComponentsClientHttpRequestFactory,需要用到 HttpClient4.
- public RestTemplate(List<HTTPMESSAGECONVERTER<?>> messageConverters),使用SpringMvc的应该对HttpMessageConverter很熟悉了,RestTemplate默认会给我们设置好常用的HttpMessageConverter,我一般很少使用到这个构造方法。
HttpComponentsClientHttpRequestFactory
这里主要讨论的是通过第二个构造方法来使用HttpClient4 来进行网络传输。下面我们来看下HttpComponentsClientHttpRequestFactory这个类。先看看他的构造方法
/** * Create a new instance of the {@code HttpComponentsClientHttpRequestFactory} * with a default {@link HttpClient}. */public HttpComponentsClientHttpRequestFactory() {this(HttpClients.createSystem());}/** * Create a new instance of the {@code HttpComponentsClientHttpRequestFactory} * with the given {@link HttpClient} instance. * <p>As of Spring Framework 4.0, the given client is expected to be of type * {@link CloseableHttpClient} (requiring HttpClient 4.3+). * @param httpClient the HttpClient instance to use for this request factory */public HttpComponentsClientHttpRequestFactory(HttpClient httpClient) {Assert.notNull(httpClient, "'httpClient' must not be null");Assert.isInstanceOf(CloseableHttpClient.class, httpClient, "'httpClient' is not of type CloseableHttpClient");this.httpClient = (CloseableHttpClient) httpClient;}
如果我们不指定一个HttpClient的话,会默认帮我们创建一个,如果我们程序调用比较频繁的话,为了提高性能,会考虑使用PoolingHttpClientConnectionManager来构建HttpClient,这时候就会使用到第二个。如何使用PoolingHttpClientConnectionManager来创建HttpClient呢?可以参考几个文章:http://www.linuxidc.com/Linux/2015-06/119099.htm 以及我前面的一篇:http://www.linuxidc.com/Linux/2015-06/119098p2.htm ,这里就不具体讲了,可以网上搜索相关资料。
下面写写代码来描述下怎么通过HttpComponentsClientHttpRequestFactory来创建RestTemplate,为了方便创建HttpClient的代码我就直接使用我前面文章中的代码:
import org.apache.http.config.Registry;import org.apache.http.config.RegistryBuilder;import org.apache.http.conn.socket.ConnectionSocketFactory;import org.apache.http.conn.socket.PlainConnectionSocketFactory;import org.apache.http.conn.ssl.NoopHostnameVerifier;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClientBuilder;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.ssl.SSLContextBuilder;import org.apache.http.ssl.TrustStrategy;import javax.net.ssl.HostnameVerifier;import javax.net.ssl.SSLContext;import java.security.KeyManagementException;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;/** * Created by Administrator on 2015/6/8. */public class HttpClientUtils { public static CloseableHttpClient acceptsUntrustedCertsHttpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { HttpClientBuilder b = HttpClientBuilder.create(); // setup a Trust Strategy that allows all certificates. // SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { return true; } }).build(); b.setSSLContext(sslContext); // don't check Hostnames, either. // -- use SSLConnectionSocketFactory.getDefaultHostnameVerifier(), if you don't want to weaken HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; // here's the special part: // -- need to create an SSL Socket Factory, to use our weakened "trust strategy"; // -- and create a Registry, to register it. // SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", sslSocketFactory) .build(); // now, we create connection-manager using our Registry. // -- allows multi-threaded use PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager( socketFactoryRegistry); connMgr.setMaxTotal(200); connMgr.setDefaultMaxPerRoute(100); b.setConnectionManager( connMgr); // finally, build the HttpClient; // -- done! CloseableHttpClient client = b.build(); return client; }}
创建并使用RestTemplate
CloseableHttpClient httpClient = HttpClientUtils.acceptsUntrustedCertsHttpClient(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); RestTemplate restTemplate = new RestTemplate(clientHttpRequestFactory); String result = restTemplate.getForObject("http://www.baidu.com",String.class); System.out.println(result);
那么问题来了,我们既然是使用Spring,那肯定希望把他RestTemplate配置成Spring bean来使用,HttpClient是线程安全的,他可以在程序中共享,创建一个成Spring bean刚好。下面是xml配置。
<bean id="httpClient" class="com.hupengcool.util.HttpClientUtils" factory-method="acceptsUntrustedCertsHttpClient"/> <bean id="clientHttpRequestFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> <constructor-arg ref="httpClient"/> </bean> <bean id="restTemplate" class=" org.springframework.web.client.RestTemplate"> <constructor-arg ref="clientHttpRequestFactory" /> </bean>
开始使用Spring RestTemplate吧。。。。。
PS:项目中除了Spring相关jar包外。需要添加HttpClient4.5,jackson 2.x的jar包。
使用HttpClient实现文件的上传下载 http://www.linuxidc.com/Linux/2014-07/104303.htm
Android 实现 HttpClient 请求Https http://www.linuxidc.com/Linux/2014-05/102306.htm
Android使用HttpClient下载图片 http://www.linuxidc.com/Linux/2014-05/101855.htm
HttpClient使用详解 http://www.linuxidc.com/Linux/2014-08/104945.htm
- 使用HttpClient4来构建Spring RestTemplate
- 使用RestTemplate来构建远程调用服务
- HttpClient4.5和RestTemplate使用
- 使用Spring RestTemplate测试
- spring RestTemplate使用
- 如何使用 Spring RestTemplate
- Spring中RestTemplate使用例子
- 使用RestTemplate Spring安全认证
- spring/springboot RestTemplate使用笔记
- Spring RestTemplate关联HttpClient4.5的配置HttpClient和自身的BUG
- 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务(包括使用 RestTemplate 与 REST 服务进行通信)
- spring RestTemplate
- spring restTemplate
- Spring RestTemplate
- Controller 使用RestTemplate进行单元测试 spring mvc
- spring中 使用restTemplate访问rest接口
- 使用spring RestTemplate进行rest接口测试
- spring rest mvc使用RestTemplate调用
- c++面向对象和c面向过程的一些概念
- 2017-01-17号 上午 计算网路和因特网、组成描述、服务描述、网络边缘、接入网 上
- centos7安装redis3.2.5集群
- 延长SAP的hybris开发版使用时间
- 基础之路02,C语言中的指针之间的算术运算
- 使用HttpClient4来构建Spring RestTemplate
- 编译原理实验一分析
- CoordinatorLayout:Android之ScrollingActivity的使用
- MATLABR2014b安装
- Darwin Streaming Server windows系统下安装和配置
- 线程的状态
- 字符串转int需要注意输入值检查 c++builder
- UVA Hangman Judge UVA - 489
- supervisor