作为springBoot的开篇系列,RestTemplate只能表示我只是个意外
what
RestTemplate是spring提供的用于访问rest服务的客户端(其实类似Apache的HttpClient,封装度更高一点)。默认是基于java.net包实现的,没有连接池的概念,也可以设置Apache的HttpClient作为作为实现。和RestTemplate功能相似的有Feign,不过Feign个人感觉有点为了封装而封装,有点多余。
Why
支持的常用的http方法
方法 |
作用 |
RestTemplate |
GET |
请求指定的页面信息,并返回实体主体 |
getForObject(String, Class, String...) |
HEAD |
只请求页面的首部 |
headForHeaders(String, String...) |
POST |
请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 |
postForLocation(String, Object, String...) |
PUT |
从客户端向服务器传送的数据取代指定的文档的内容 |
put(String, Object, String...) |
DELETE |
请求服务器删除指定的页面 |
delete(String, String...) |
OPTIONS |
允许客户端查看服务器的性能 |
optionsForAllow(String, String...) |
特性
线程安全
自定义回调操作
支持领域实体,可以直接将json转成javabean
支持URI模板
How
Maven配置
xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>org.springframeworkgroupId> <artifactId>gs-consuming-restartifactId> <version>0.1.0version> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>1.5.2.RELEASEversion> parent> <properties> <java.version>1.8java.version> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starterartifactId> dependency> <dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-webartifactId> dependency> <dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build> project>
测试代码
普通java调用风格
RestTemplate restTemplate = new RestTemplate(); SimpleClientHttpRequestFactory requestFactory = (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory(); //常用超时设置 requestFactory.setReadTimeout(6000); requestFactory.setConnectTimeout(6000); restTemplate.setRequestFactory(requestFactory); try{ String res = restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random",String.class); System.out.println("res ="+ res); }catch (RestClientException e){ e.printStackTrace(); }
Spring调用风格
生成RestTemplate实例,自动添加到spring容器中
@Configuration public class RestTemplateTest { @Bean public RestTemplate getRestTemplate(){ RestTemplate restTemplate = new RestTemplate(); SimpleClientHttpRequestFactory requestFactory = (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory(); //常用超时设置 requestFactory.setReadTimeout(6000); requestFactory.setConnectTimeout(6000); restTemplate.setRequestFactory(requestFactory); return restTemplate; } } //调用的地方自动装载RestTemplate实例 @Autowired RestTemplate restTemplate; try{ String res = restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random",String.class); System.out.println("res ="+ res); }catch (RestClientException e){ e.printStackTrace(); }
uri模板
可以只替换参数,不改变uri结构
String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, "42", "21");
Mapvars = new HashMap (); vars.put("hotel", "42"); vars.put("booking", "21"); String result = restTemplate.getForObject("http://example.com/hotels/{hotel}/bookings/{booking}", String.class, vars);
参考资料
//Spring官网对RestTemplate的介绍
https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate/
//spring官网对RestTemplate的使用向导
https://spring.io/guides/gs/consuming-rest/
//应该是目前RestTemplate介绍比较多的博客
http://liuxing.info/2015/05/21/RestTemplate%E5%AE%9E%E8%B7%B5/