Spring – RestTemplate
- JSON (JavaScript Object Notation )
- XML
- HTML
- XLT
- Python
- PHP
- Plain text
先决条件: '客户端'可以是任何前端框架,如 Angular、React,用于开发单页应用程序(SPA)等,也可以是后端内部/外部 Spring 应用程序本身。
要与 REST 交互,客户端需要创建客户端实例和请求对象、执行请求、解释响应、将响应映射到域对象以及处理异常。Spring 框架通常既创建 API,又使用内部或外部应用程序的 API。这一优势还有助于我们开发微服务。为了避免这种样板代码,Spring 提供了一种使用 REST API 的便捷方式 - 通过“RestTemplate”。
使用 REST API 如下:
'RestTemplate' 是核心 Spring 框架提供的同步 REST 客户端。
path:
org.springframework.web.client.RestTemplate
Constructors:
- RestTemplate() - RestTemplate(ClientHttpRequestFactory requestFactory) - RestTemplate(List<HttpMessageConverter<?>> messageConverters)
它总共提供了 41 种与 REST 资源交互的方法。但只有十几种独特的方法被重载,从而构成了完整的 41 种方法集。
手术 | 方法 | 执行的操作 |
---|---|---|
DELETE | delete() | 对指定 URL 上的资源执行 HTTP DELETE 请求。 |
GET | getForEntity() | 发送 HTTP GET 请求,返回包含从响应主体映射的对象的 ResponseEntity。 发送 HTTP GET 请求,返回从响应主体映射的对象。 |
getForObject() | ||
POST | postForEntity() | 将数据 POST 到 URL,返回包含从响应主体映射的对象的 ResponseEntity。 将数据 POST 到 URL,返回新创建资源的 URL。 将数据 POST 到 URL,返回从响应主体映射的对象。 |
postForLocation() | ||
postForObject() | ||
PUT | put() | 将资源数据PUT到指定的URL。 |
PATCH | patchForObject() | 发送 HTTP PATCH 请求,返回从响应主体映射的结果对象。 |
HEAD | headForHeaders() | 发送 HTTP HEAD 请求,返回指定资源 URL 的 HTTP 标头。 |
ANY | exchange() | 对 URL 执行指定的 HTTP 方法,返回包含对象的 ResponseEntity。 针对 URL 执行指定的 HTTP 方法,返回从响应主体映射的对象。 |
execute() | ||
OPTIONS | optionsForAllow() | – 发送 HTTP OPTIONS 请求,返回指定 URL 的 Allow 标头。 |
除了 TRACE 之外,RestTemplate 为每个标准 HTTP 方法都提供了至少一个方法。execute() 和 exchange() 提供了使用任何 HTTP 方法发送请求的低级通用方法。上述大多数方法都以以下 3 种形式重载:
- 接受一个字符串 URL 规范,其中 URL 参数在变量参数列表中指定。
- 接受一个字符串 URL 规范,其中 URL 参数在 Map<String, String> 中指定。
- 接受 java.net.URI 作为 URL 规范,但不支持参数化 URL。
为了使用 RestTemplate,我们可以通过如下所示创建一个实例:
RestTemplate rest = new RestTemplate();
另外,您可以将其声明为一个 bean 并按如下所示进行注入:
// Annotation @Bean// Method public RestTemplate restTemplate() {return new RestTemplate(); }
项目结构——Maven
A.文件: pom.xml (配置)
XML
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion >4.0.0</modelVersion> <parent> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-starter-parent</artifactId> <version >2.6.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId >sia</groupId> <artifactId >GFG-RestTemplate</artifactId> <version >0.0.1-SNAPSHOT</version> <name >GFG-RestTemplate</name> <description >Rest-Template</description> <properties> <java.version >11</java.version> </properties> <dependencies> <dependency> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId >org.projectlombok</groupId> <artifactId >lombok</artifactId> <optional >true</optional> </dependency> <dependency> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-starter-test</artifactId> <scope >test</scope> </dependency> <dependency> <groupId >org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-devtools</artifactId> <scope >runtime</scope> <optional >true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId >org.springframework.boot</groupId> <artifactId >spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId >org.projectlombok</groupId> <artifactId >lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project> |
B. 文件: GfgRestTemplateApplication.java(应用程序的引导)
Java
// Java Program to Illustrate Bootstrapping of Application package gfg; // Importing required classes import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; // Annotation @SpringBootApplication // Main class public class GfgRestTemplateApplication { // Main driver method public static void main(String[] args) { SpringApplication.run( GfgRestTemplateApplication.class, args); } } |
A.文件:UserData.java(领域类)
- 该类使用Lombok库自动生成带有@Data注释的Getter/Setter方法。
- Lombok的依赖关系如下图所示:
Maven – pom.xm l
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency>
例子:
Java
package gfg; import lombok.Data; @Data public class UserData { public String id; public String userName; public String data; } |
B.RestApiController.java(Rest 控制器 - REST API)
GET – 以 JSON 格式返回域数据。
POST-返回与标头一起包装在 ResponseEntity 中的域数据。
例子:
Java
// Java Program to illustrate Rest Controller REST API
|
C.文件:RestTemplateProvider.java(RestTemplate实现)
GET——使用 REST API 的 GET 映射响应并返回域对象。
POST – 使用 REST API 的 POST 映射响应并返回 ResponseEntity 对象。
例子:
Java
// Java Program to Implementation of RestTemplate package gfg; // Importing required classes import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; // Class public class RestTemplateProvider { // Creating an instance of RestTemplate class RestTemplate rest = new RestTemplate(); // Method public UserData getUserData() { return rest.getForObject( "http://localhost:8080/RestApi/getData", UserData.class); } // Method public ResponseEntity<UserData> post(UserData user) { return rest.postForEntity( "http://localhost:8080/RestApi", user, UserData.class, ""); } } |
D.文件:ConsumeApiController.java(常规控制器 - 使用 REST API)
使用 RestTemplate 从 REST API 获取数据并相应地更改和返回视图。
Java
// Java Program to illustrate Regular Controller // Consume REST API package gfg; // Importing required classes import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; // Annotation @Controller @RequestMapping("/Api") // Class public class ConsumeApiController { // Annotation @GetMapping public String get(Model model) { // Creating an instance of RestTemplateProvider // class RestTemplateProvider restTemplate = new RestTemplateProvider(); model.addAttribute("user", restTemplate.getUserData()); model.addAttribute("model", new UserData()); return "GetData"; } // Annotation @PostMapping public String post(@ModelAttribute("model") UserData user, Model model) { RestTemplateProvider restTemplate = new RestTemplateProvider(); ResponseEntity<UserData> response = restTemplate.post(user); model.addAttribute("user", response.getBody()); model.addAttribute("headers", response.getHeaders() + " " + response.getStatusCode()); return "GetData"; } } |
E.文件:GetData.html(显示结果 – Thymeleaf 模板)
HTML
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <title>GFG-REST-TEMPLATE</title> <style> h1{ color:forestgreen; } p{ width:500px; } </style> </head> <body> <h1>Hello Geek</h1> <h1 th:text="${user.id}"> Replaceable text </h1 > <h1 th:text="${user.userName}"> Replaceable text </h1 > <h1 th:text="${user.data}"> Replaceable text </h1 > <form method="POST" th:object="${model}"> <label for="id">Type ID : </label><br/> <input type="text" th:field="*{id}"><br/> <label for="userName">Type USERNAME : </label><br/> <input type="text" th:field="*{userName}"><br/> <label for="data">Type DATA : </label><br/> <input type="text" th:field="*{data}"> <input type="submit" value="submit"> </form> <p th:text="${headers}"></p> </body> </html> |
输出:依次如下
(GET 请求)
(POST 请求)
笔记:
- 当您的后端 Spring 应用程序充当同一个或另一个 Spring 应用程序的 REST API 的客户端时,RestTemplate 使其变得方便并避免繁琐的工作。
- 处理 HTTPS URL 时,如果使用自签名证书,则会出现错误。出于开发目的,最好使用 HTTP。