当前位置: 首页 > article >正文

Spring Boot教程之十二: Spring – RestTemplate

 Spring – RestTemplate

 由于流量大和快速访问服务,REST API越来越受欢迎。REST 不是一种协议或标准方式,而是一组架构约束。它也被称为 RESTful API 或 Web API。当发出客户端请求时,它只是通过 HTTP 将资源状态的表示传输给请求者或端点。传递给客户端的信息可以采用以下几种格式:
  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 种方法集。

手术

方法                        

执行的操作                                                                                                                                                                 

DELETEdelete()对指定 URL 上的资源执行 HTTP DELETE 请求。
GETgetForEntity()

发送 HTTP GET 请求,返回包含从响应主体映射的对象的 ResponseEntity。

发送 HTTP GET 请求,返回从响应主体映射的对象。

getForObject() 
POSTpostForEntity() 

将数据 POST 到 URL,返回包含从响应主体映射的对象的 ResponseEntity。

将数据 POST 到 URL,返回新创建资源的 URL。

将数据 POST 到 URL,返回从响应主体映射的对象。

postForLocation()
postForObject() 
PUTput() 

将资源数据PUT到指定的URL。

PATCHpatchForObject()发送 HTTP PATCH 请求,返回从响应主体映射的结果对象。
HEADheadForHeaders()发送 HTTP HEAD 请求,返回指定资源 URL 的 HTTP 标头。
ANYexchange() 

对 URL 执行指定的 HTTP 方法,返回包含对象的 ResponseEntity。

针对 URL 执行指定的 HTTP 方法,返回从响应主体映射的对象。

execute()
OPTIONSoptionsForAllow()– 发送 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。   
     


http://www.kler.cn/a/415798.html

相关文章:

  • 0基础学前端系列 -- 深入理解 HTML 布局
  • 架构学习第五周--Kubernetes(一)
  • qt QProxyStyle详解
  • 回声消除延时估计的一些方法
  • Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解
  • 探索 Vue 3.0中Treeshaking特性?
  • [巅峰极客 2021]签到
  • 如何具体实现商品详情的提取?
  • 等保测评在云计算方面的应用讲解
  • 从覆盖到拼接:优化 onInput 事件的输入
  • uniapp开发微信小程序笔记8-uniapp使用vant框架
  • 3.26线性回归对率回归
  • 家校通小程序实战教程02口令管理
  • 【SCT61240QFJCR】用于超小型汽车摄像头模块的四通道电源管理IC,国产 车规
  • Git 提交代码日志信息
  • C语言第15讲:C语言内存函数
  • shell第二次作业
  • 程成本控制系统如何跟工程现场管理结合起来?
  • 【Unity-如何提高物理引擎的高精度模拟】
  • 【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南
  • [Python/网络安全] Git漏洞之Githack工具基本安装及使用详析
  • Pytorch使用手册-使用 TensorBoard 可视化模型、数据和训练过程(专题十)
  • JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】
  • 如何选择黑白相机和彩色相机
  • GAN是一种自监督模型那在判别器中,同时输入生成器生成的SR与真实值HR作比较的话,不就是将HR作为SR的标签吗,如何体现自监督学习呢
  • YOLOv11融合Inner-IoU及相关改进思路