RestTemplate


成都创新互联专业IDC数据服务器托管提供商,专业提供成都服务器托管,服务器租用,
川西大数据中心,
川西大数据中心,成都多线服务器托管等服务器托管服务。简介
RestTemplate
是由Spring
框架提供的一个可用于应用中调用rest
服务的类它简化了与http
服务的通信方式,统一了RESTFul
的标准,封装了http
连接,我们只需要传入url
及其返回值类型即可。相较于之前常用的HttpClient
,RestTemplate
是一种更为优雅的调用RESTFul
服务的方式。- 在
Spring
应用程序中访问第三方REST服务
与使用Spring RestTemplate
类有关。RestTemplate
类的设计原则与许多其他Spring
的模板类(例如JdbcTemplate
)相同,为执行复杂任务提供了一种具有默认行为的简化方法。 RestTemplate
默认依赖JDK提供了http
连接的能力(HttpURLConnection
),如果有需要的话也可以通过setRequestFactory
方法替换为例如Apache HttpCompoent、Netty或OKHttp
等其他Http libaray
。- 考虑到了
RestTemplate
类是为了调用REST服务而设计的,因此它的主要方法与REST
的基础紧密相连就不足为奇了,后者时HTTP
协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS
例如,RestTemplate
类具有headForHeaders()、getForObject()、putForObject(),put()和delete()
等方法。
创建
RestTemplate
因为RestTemplate
是Spirng
框架提供的所以只要是一个Springboot
项目就不用考虑导包的问题,这些都是提供好的。
但是Spring
并没有将其加入SpringBean
容器中,需要我们手动加入,因为我们首先创建一个Springboot
配置类,再在配置类中将我们的RestTemlate
注册到Bean
容器中
方法一
使用Springboot
提供的RestTemplateBuilder
构造类来构造一个RestTemplate
,可以自定义一些连接参数,如:连接超时时间,读取超时时间,还有认证信息等

@Configuration
public class WebConfiguration {@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){return builder
//设置连接超时时间
.setConnectTimeout(Duration.ofSeconds(5000))
//设置读取超时时间
.setReadTimeout(Duration.ofSeconds(5000))
//设置认证信息
.basicAuthentication("username","password")
//设置根路径
.rootUri("https://api.test.com/")
//构建
.build();
}
}
添加自定义的拦截器
自定义拦截器示例
@Slf4j
public class CustomClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {//打印请求明细
logRequestDetails(request,body);
ClientHttpResponse response = execution.execute(request, body);
//打印响应明细
logResponseDetails(response);
return response;
}
private void logRequestDetails(HttpRequest request, byte[] body){log.debug("Headers:{}",request.getHeaders());
log.debug("body:{}",new String(body, StandardCharsets.UTF_8));
log.debug("{}:{}",request.getMethod(),request.getMethodValue());
}
private void logResponseDetails(ClientHttpResponse response) throws IOException {log.debug("Status code : {}",response.getStatusCode());
log.debug("Status text : {}",response.getStatusText());
log.debug("Headers : {}",response.getHeaders());
log.debug("Response body: {}", StreamUtils.copyToString(response.getBody(),StandardCharsets.UTF_8));
}
}
使用RestTemplateBuilder
构造类,添加自定义拦截器,构造带有自定义拦截器的RestTemplate
实例
@Configuration
public class WebConfiguration {@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){return builder
.additionalInterceptors(new CustomClientHttpRequestInterceptor())
//构建
.build();
}
}
测试请求确实经过了拦截器,注册成功(注意请求和响应的流只会被读取一次,这里我们读取了response后返回的response就读取不到刚刚读过的内容了)

方法二
使用RestTemplate
构造方法构造一个RestTemlate
,虽然不能像RestTemplate
构造类那样更详细、更多样的配置参数,但是RestTemplate
构造方法在一般情况是够用的。

- 无参构造 全部参数默认
- 指定
ClientHttpRequestFactory
的构造方法可以指定自己实现的ClientHttpRequestFactory
(客户端http
请求工厂)其他的与无参构造相同。 - 指定
List>
的构造方法可以指定自己是实现的HttpMessageConverter
(Http
消息转换器)传入其他与无参构造相同。
@Configuration
public class WebConfiguration {@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
}
两者方法都可使用,前者提供了多样的自定义参数的选择,可以将RestTemplate
配置的更为完善,后者则简化了配置虽然配置多样性不如前者,但是日常使用调用些API
还是足以使用
RestTemplate API
使用
在使用RestTemplate
前先让我们看看RestTemplate
有哪些API


相信大家看到这么多方法,一定很头大,但是我们仔细看上述的方法,我们可以提取出主要的几种方法是(这里只讨论Http请求的):
GET
POST
PUT
DELETE
HEAD
OPTIONS
EXCHANGE
EXECUTE
这里我给大家安利一个一个网站,它提供免费的RESTFul api的样例测试。httpbin A simple HTTP Request & Response Service.
GET
通过上图我们可以发现RestTemlate
发送GET
请求的方法有两种
publicT getForObject(...)
publicResponseEntitygetForEntity(...)
getForEntity()
后缀带有Entity
的方法都代表返回一个ResponseEntity
,ResponseEntity
是Spring对HTTP
请求响应的封装,包括了几个重要的元素,如响应码,contentType、contentLength
、响应消息体等

通过它继承父类(HttpEntity
)的getHeader()
方法我们可以获取contentType、contentLength
、响应消息体等。比如下面这个例子。
public void queryWeather() {ResponseEntity