Spring Boot教程之十二: Spring – RestTemplate

ops/2024/11/29 17:48:58/

 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.ppmy.cn/ops/137702.html

相关文章

网络原理(一)—— http

什么是 http http 是一个应用层协议&#xff0c;全称为“超文本传输协议”。 http 自 1991 年诞生&#xff0c;目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的&#xff0c;例如 http1.0&#xff0c;http1.0&#xff0c;http2.0 http3 是…

霍夫变换:原理剖析与 OpenCV 应用实例

简介&#xff1a;本文围绕霍夫变换相关内容展开&#xff0c;先是讲解霍夫变换基本原理&#xff0c;包含从 xy 坐标系到 kb 坐标系及极坐标系的映射等。接着介绍了 cv2.HoughLines、cv2.HoughLinesP 概率霍夫变换、cv2.HoughCircles 霍夫圆变换的函数用法、参数含义、与常规霍夫…

基于java web的网上书店系统设计

摘 要 随着互联网的越发普及&#xff0c;网上购物成为了当下流行的热门行为。网络上开店创业有许多的优势&#xff1a;投入少&#xff0c;启动 资金低&#xff0c;交易便捷。网上书店与传统的线下书店比起来优势巨大&#xff0c;网上书店的经营方式和销售渠道是不同与线下书 店…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…

单片机知识总结(完整)

1、单片机概述 1.1. 单片机的定义与分类 定义&#xff1a; 单片机&#xff08;Microcontroller Unit&#xff0c;简称MCU&#xff09;是一种将微处理器、存储器&#xff08;包括程序存储器和数据存储器&#xff09;、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…

蓝桥杯不知道叫什么题目

小蓝有一个整数&#xff0c;初始值为1&#xff0c;他可以花费一些代价对这个整数进行变换。 小蓝可以花贵1的代价将教数增加1。 小蓝可以花费3的代价将整数增加一个值,这个值是整数的数位中最大的那个(1到9) .小蓝可以花费10的代价将整数变为原来的2倍, 例如&#xff0c;如果整…

GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?

在技术快速发展的今天&#xff0c;代码辅助工具已成为提升开发效率的利器。今天&#xff0c;我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能&#xff0c;这不仅是技术上的一次飞跃&#xff0c;更是对开发者工作流程的一次革新。 多模型选择&#xff1a…

Spring Boot【四】

单例bean中使用多例bean 1.lookup-method方式实现 当serviceB中调用getServiceA的时候&#xff0c;系统自动将这个方法拦截&#xff0c;然后去spring容器中查找对应的serviceA对象然后返回 2.replaced-method&#xff1a;方法替换 我们可以对serviceB这个bean中的getServiceA…