【SpringBoot】SpringBoot 之RestTemplate的使用
本文内容纲要:
-RestTemplate介绍
-RestTemplate实现
-RestTemplate使用
RestTemplate介绍
调用远程服务时就必须使用HTTP客户端,主要有四种:JDK原生的URLConnection、Apache的HttpClient、Netty的异步HTTPClient,Spring的RestTemplate。
解放了原先HttpClient的复杂提交,java中调用RESTful服务很典型的是使用HttpClient,对于常用的REST操作,这些方法属于低等级的操作。使用HttpClient我们需要自己封装Post请求,再根据响应的状态码判断从响应中获取header和body,有时候还需要自己做json转换。
Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
在Spring应用程序中访问第三方REST服务与使用SpringRestTemplate类有关。RestTemplate类的设计原则与许多其他Spring*模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如ApacheHttpComponents、Netty或OkHttp等其它HTTPlibrary。
考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。
RestTemplate实现
最新api地址:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
RestTemplate包含以下几个部分:
- HttpMessageConverter对象转换器
- ClientHttpRequestFactory默认是JDK的HttpURLConnection
- ResponseErrorHandler异常处理
- ClientHttpRequestInterceptor请求拦截器
RestTemplate是spring的一个rest客户端,在spring-web这个包下,springboot的依赖如下:
1<dependency>
2<groupId>org.springframework.boot</groupId>
3<artifactId>spring-boot-starter-web</artifactId>
4</dependency>
点进去可以看到spring-web
1<dependency>
2<groupId>org.springframework</groupId>
3<artifactId>spring-web</artifactId>
4<version>5.1.9.RELEASE</version>
5</dependency>
所以如果在非spring的框架下直接引入spring-web这个包即可。
RestTemplate有三个实现
1packageorg.springframework.web.client;
2
3publicclassRestTemplateextendsInterceptingHttpAccessorimplementsRestOperations{
4
5...
6
7publicRestTemplate(){
8...
9}
10
11publicRestTemplate(ClientHttpRequestFactoryrequestFactory){
12...
13}
14
15publicRestTemplate(List<HttpMessageConverter<?>>messageConverters){
16...
17}
18}
RestTemplate使用
新建一个SpringBootWeb工程,引入依赖spring-boot-starter-web
1<dependency>
2<groupId>org.springframework.boot</groupId>
3<artifactId>spring-boot-starter-web</artifactId>
4</dependency>
1、restTemplate获取字符串
****RESTAPI代码
1@RequestMapping(value="/employees",produces=MediaType.TEXT_HTML_VALUE,method=RequestMethod.GET)
2publicStringgetAllEmployeesHtml(Modelmodel)
3{
4model.addAttribute("employees",employeeMapper.getEmps());
5return"employees";
6}
REST客户端代码
1//获取字符串
2@Test
3publicvoidtest01(){
4Stringurl="http://localhost:8080/employees";
5Stringres1=restTemplate.getForObject(url,String.class);
6System.out.println("getForObject======"+res1);
7}
2、使用RestTemplate的自定义HTTP标头
****RESTAPI代码
1@RequestMapping(value="/employees",produces=MediaType.APPLICATION_JSON_VALUE,method=RequestMethod.GET)
2@ResponseBody
3publicList<Employee>getAllEmployeesJSON()
4{
5returnemployeeMapper.getEmps();
6}
REST客户端代码
//使用RestTemplate的自定义HTTP标头
@Test
publicvoidtest02(){
Stringurl="http://localhost:8080/employees";
HttpHeadersheaders=newHttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<String>entity=newHttpEntity<String>("parameters",headers);
ResponseEntity<String>res2=restTemplate.exchange(url,HttpMethod.GET,entity,String.class);
System.out.println("exchange======"+res2);
}
**3、获取响应作为对象**
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.GET)
2@ResponseBody
3publicEmployeeget(@PathVariable("id")Integerid){
4returnemployeeMapper.getEmpById(id);
5}
REST客户端代码
1//获取响应作为对象
2@Test
3publicvoidtest03(){
4Stringurl="http://localhost:8080/employee/1";
5
6Employeeres3=restTemplate.getForObject(url,Employee.class);
7System.out.println("getForObject======"+res3);
8}
9
10//获取响应作为对象,并获取响应对象状态
11@Test
12publicvoidtest033(){
13Stringurl="http://localhost:8080/employee/1";
14ResponseEntity<Employee>res3=restTemplate.getForEntity(url,Employee.class);
15System.out.println("getStatusCode======"+res3.getStatusCode());
16System.out.println("getForEntity======"+res3);
17}
4、URL参数
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.GET)
2@ResponseBody
3publicEmployeeget(@PathVariable("id")Integerid){
4returnemployeeMapper.getEmpById(id);
5}
REST客户端代码
1//URL参数
2@Test
3publicvoidtest04(){
4Stringurl="http://localhost:8080/employee/{id}";
5
6Map<String,String>params=newHashMap<String,String>();
7params.put("id","1");
8Employeeres4=restTemplate.getForObject(url,Employee.class,params);
9System.out.println("getForObject======"+res4);
10}
5、HTTPPOST方法
RESTAPI代码
1@RequestMapping(value="/employee",method=RequestMethod.POST)
2@ResponseBody
3publicStringsave(@RequestBodyEmployeeemployee){
4System.out.println("post===="+employee);
5return"success";
6}
REST客户端代码
1//HTTPPOST方法
2@Test
3publicvoidtest05(){
4Stringurl="http://localhost:8080/employee";
5
6EmployeenewEmployee=newEmployee(-1,"小黑","1","test@email.com");
7Stringres5=restTemplate.postForObject(url,newEmployee,String.class);
8System.out.println("postForObject======"+res5);
9}
6、HTTPPUT方法示例
RESTAPI代码
1@RequestMapping(value="/employee",method=RequestMethod.PUT)
2@ResponseBody
3publicStringupdate(@RequestBodyEmployeeemployee){
4System.out.println("put===="+employee);
5return"success";
6}
REST客户端代码
1//HTTPPUT方法示例
2@Test
3publicvoidtest06(){
4Stringurl="http://localhost:8080/employee";
5EmployeenewEmployee=newEmployee(-1,"小黑","1","test@email.com");
6restTemplate.put(url,newEmployee);
7}
7、HTTPDELETE方法示例
RESTAPI代码
1@RequestMapping(value="/employee/{id}",method=RequestMethod.DELETE)
2@ResponseBody
3publicStringdelete(@PathVariable("id")Integerid){
4System.out.println("delete===="+id);
5return"success";
6}
REST客户端代码
1//HTTPDELETE方法示例
2@Test
3publicvoidtest07(){
4Stringurl="http://localhost:8080/employee/1";
5restTemplate.delete(url);
6}
本文内容总结:RestTemplate介绍,RestTemplate实现,RestTemplate使用,
原文链接:https://www.cnblogs.com/h--d/p/12609753.html