RestTemplate的几种实现
2018年08月25日 23:47:58 月未明 阅读数:4300
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35981283/article/details/82056285
环境
Spring Boot2.0
JDK 1.8
RestTemplate是spring的一个rest客户端,在spring-web这个包下,spring boot的依赖如下
org.springframework.boot
spring-boot-starter-web
点进去可以看到spring-web
org.springframework
spring-web
5.0.4.RELEASE
compile
所以如果在非spring的框架下直接引入spring-web这个包即可。
RestTemplate只是对其它Rest客户端的一个封装,本身并没有自己的实现。
很多人都说Spring Boot 2.0之前RestTestTemplate的默认实现是HttpClient,2.+为OKHttp3,其实这种说法并不完全正确,如果没有引入这些客户端的jar包,其默认实现是HttpURLConnection(集成了URLConnection),这是JDK自带的REST客户端实现。
RestTemplate有三个实现
RestTemplate(ClientHttpRequestFactory requestFactory)是为们要说的重点,跟踪ClientHttpRequestFactory查看其实现,如下图
这里写图片描述
先看默认实现的测试代码
RestConfig
package com.pk.client.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* Created by pangkunkun on 2018/8/25.
*/
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
}
MyRestController
package com.pk.client.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
* Created by pangkunkun on 2018/8/25.
*/
@RestController
public class MyRestController {
private static final Logger logger = LoggerFactory.getLogger(MyRestController.class);
@Autowired
private RestTemplate restTemplate;
private static final String URL = "http://localhost:8081/server";
@GetMapping("/default")
public void defaultRestClient(){
String result = restTemplate.getForObject(URL,String.class);
logger.info("result = {}",result);
}
}
Server端代码
package com.pk.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by pangkunkun on 2018/8/25.
*/
@SpringBootApplication
@RestController
public class RestServerApplication {
public static void main(String[] args) {
SpringApplication.run(RestServerApplication.class,args);
}
@GetMapping("/server")
public String restServer(){
System.out.println("This is rest server");
return "success";
}
}
在浏览器调用client之后会追踪到下面这里
这里写图片描述
在这里就可以看到其实现方式是HttpURLConnection(URLConnection)。
所以,在没有第三方依赖的情况下其默认实现是URLConnection。
现在来看下其它几种客户端的引入。在ClientHttpRequestFactory的实现那张图中列出了RestTemplate的几种REST Client的封装。其中最常用的有以下三种:
SimpleClientHttpRequestFactory(封装URLConnection)
HttpComponentsClientHttpRequestFactory(封装HttpClient)
OkHttp3ClientHttpRequestFactory(封装OKHttp)
其实Netty4ClientHttpRequestFactory这个为在测试的时候也测试过,不过spring boot 2.0之后就不推荐使用了,而且我测试的时候性能上明显不如其它几个,所以这里没加上
其切换与使用也很简单,在pom中引入相应依赖
org.apache.httpcomponents
httpclient
4.5.6
com.squareup.okhttp3
okhttp
3.11.0
在Config中的配置
package com.pk.client.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* Created by pangkunkun on 2018/8/25.
*/
@Configuration
public class RestConfig {
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
return restTemplate;
}
@Bean("urlConnection")
public RestTemplate urlConnectionRestTemplate(){
RestTemplate restTemplate = new RestTemplate(new SimpleClientHttpRequestFactory());
return restTemplate;
}
@Bean("httpClient")
public RestTemplate httpClientRestTemplate(){
RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory());
return restTemplate;
}
@Bean("OKHttp3")
public RestTemplate OKHttp3RestTemplate(){
RestTemplate restTemplate = new RestTemplate(new OkHttp3ClientHttpRequestFactory());
return restTemplate;
}
}
其实使用的时候一般都会只选择其中的一种,所以上面的几种配置任选其一,替换掉最上边那个就好。其它不再细说了。
这里是代码的GitHub地址RestTemplateSample。
https://github.com/rhettpang/RestTemplateSample