Spring Boot教程之十二: Spring – RestTemplate

时间:2024-11-30 06:59:54
  1. JSON (JavaScript Object Notation )
  2. XML
  3. HTML
  4. XLT
  5. Python
  6. PHP
  7. Plain text

先决条件: '客户端'可以是任何前端框架,如 Angular、React,用于开发单页应用程序(SPA)等,也可以是后端内部/外部 Spring 应用程序本身。 

要与 REST 交互,客户端需要创建客户端实例和请求对象、执行请求、解释响应、将响应映射到域对象以及处理异常。Spring 框架通常既创建 API,又使用内部或外部应用程序的 API。这一优势还有助于我们开发微服务。为了避免这种样板代码,Spring 提供了一种使用 REST API 的便捷方式 - 通过“RestTemplate”。

使用 REST API 如下:

使用 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 种形式重载:

  1. 接受一个字符串 URL 规范,其中 URL 参数在变量参数列表中指定。
  2. 接受一个字符串 URL 规范,其中 URL 参数在 Map<String, String> 中指定。
  3. 接受 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
 
package gfg;
 
// Importing required classes
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
// Annotation
@RestController
@RequestMapping(path = "/RestApi",
                produces = "application/json")
@CrossOrigin(origins = "*")
 
// Class
public class RestApiController {
 
    @GetMapping("/getData") public UserData get()
    {
        UserData userData = new UserData();
        userData.setId("1");
        userData.setUserName("darshanGPawar@geek");
        userData.setData("Data send by Rest-API");
 
        return userData;
    }
 
    // Annotation
    @PostMapping
 
    public ResponseEntity<UserData>
    post(@RequestBody UserData userData)
    {
        HttpHeaders headers = new HttpHeaders();
        return new ResponseEntity<>(userData, headers,
                                    HttpStatus.CREATED);
    }
}


 

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。