首页 文章资讯内容详情

【SpringBoot】SpringBoot 之RestTemplate的使用

2026-06-01 4 花语

本文内容纲要:

-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