功能实现——使用 RestTemplate 进行跨项目接口调用

news2025/1/22 19:09:40

目录

  • 1.需求说明
  • 2.项目环境搭建
  • 3.代码实现
    • 3.1.使用 RestTemplate 进行调用
      • 3.1.1.项目 A
      • 3.1.2.项目 B
    • 3.2.测试
    • 3.3.使用 JsonObject 来传递和接收 json 数据
      • 3.3.1.说明
      • 3.3.2.代码实现
    • 3.4.其它说明
      • 3.4.1.restTemplate.exchange()
      • 3.4.2.restTemplate.postForObject()
      • 3.4.3.区别总结

1.需求说明

现在项目 A 需要通过调用项目 B 中的接口(传递的信息有员工 id 和员工姓名)来获得某一员工的其它信息,现在要使用 RestTemplate 来完成这一跨项目接口调用。

注:项目 A 和项目 B 并未在同一个 Spring Cloud 或类似微服务框架中,因此这里暂不考虑使用 Feign 来进行服务调用。

2.项目环境搭建

(1)在 IDEA 中创建两个 Spring Boot 项目(分别称为项目 A 和项目 B),具体可以参考【环境搭建】使用IDEA创建SpringBoot项目详细步骤这篇文章。

(2)项目 A 的配置文件 application.yml 中的内容如下:

server:
  port: 8080

rpc:
  # 项目 B 的接口地址
  url: http://localhost:8081/employ/info

(3)项目 B 的配置文件 application.yml 中的内容如下:

server:
  port: 8081

为了方便,本文创建的两个项目都是在本地运行的,因此它们的端口号不能一样。

3.代码实现

3.1.使用 RestTemplate 进行调用

(1)RestTemplate 是一个用于访问 RESTful 服务的 Spring Framework 类。它基于 HTTP 协议,可以进行 GET、POST、PUT、DELETE 等 HTTP 操作,用于向远程服务器发送请求并处理响应。因此本文选择使用 RestTemplate 来进行接口调用。

(2)RestTemplate 的详细信息见官网文档。

在这里插入图片描述

3.1.1.项目 A

EmployeeEntity.java

import lombok.Data;

@Data
public class EmployeeEntity {
    private String id;

    private String name;

    private String posName;

    private String jobLevelName;

    private String departmentName;
}

RPCController.java

import com.example.htmltopdf.domain.EmployeeEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.Collections;

@Slf4j
@RestController
@RequestMapping("/rpc")
public class RPCController {

    @Value("${rpc.url}")
    private String URL;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * @description: 模拟通过调用项目 B 的接口来根据员工 id 和 name 获取员工的其它信息
     * @param employeeEntity 员工信息,只包含 id 和 name
     * @return: 员工信息
     * */
    @PostMapping()
    public EmployeeEntity getEmpInfo(EmployeeEntity employeeEntity) {
        //设置请求头,特别是 Content-Type 和 Accept 头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

        //设置请求体,这里是将员工 id 和员工 name 封装到 EmployeeEntity 对象中
        HttpEntity<EmployeeEntity> requestEntity = new HttpEntity<>(employeeEntity, headers);

        //发送 POST 请求,并接收返回的 JSON 结果
        EmployeeEntity result = restTemplate.postForObject(URL, requestEntity, EmployeeEntity.class);
        assert result != null;
        log.info(result.toString());
        return result;
    }
}

3.1.2.项目 B

EmployeeEntity.java

//代码同上

EmployeeController.java

import com.example.oss.domain.EmployeeEntity;
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;

@RestController
@RequestMapping("/employ")
public class EmployeeController {

    @PostMapping("/info")
    public EmployeeEntity getEmployeeInfo(@RequestBody EmployeeEntity employeeEntity) {

        //根据项目 A 传过来的 employeeEntity 进行相关操作,下面就直接设置了,并没有真的去数据库中查找

        employeeEntity.setPosName("软件开发工程师");
        employeeEntity.setJobLevelName("高级");
        employeeEntity.setDepartmentName("软件开发部");

        return employeeEntity;
    }
}

3.2.测试

启动项目 A 和 B 后,在 Postman 中进行接口测试(注意是 POST 请求):

http://localhost:8080/rpc

在这里插入图片描述

3.3.使用 JsonObject 来传递和接收 json 数据

3.3.1.说明

(1)通过上面的代码可知,项目 A 在向项目 B 发送 Post 请求时,将请求体中的信息(员工 id 和员工 name)封装到 EmployeeEntity对象中,而此时项目 B 中的接口也需要用相同的类对象来进行接收(如果通过 id 和 name 来接收会接收不到)。为了提高接口调用时传递和接收 json 数据的灵活性,我们可以考虑使用 JsonObject

(2)JsonObject 是指在 Java 中用来表示 JSON 对象的类或数据结构。它通常是指在 JSON 解析过程中,将 JSON 字符串解析为 Java 对象的一种表示形式。具体来说:

  • JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它以键值对的形式组织数据,并使用逗号分隔,大括号 {} 包裹对象,方括号 [] 包裹数组。
  • JsonObject 是 Gson、Jackson 等库在 Java 中提供的类,用来表示一个 JSON 对象。它可以包含各种类型的数据:字符串、数字、布尔值、数组、甚至嵌套的对象。
  • 在 Java 中使用 JsonObject 可以方便地解析、操作和生成 JSON 数据。例如,当从 HTTP 请求中接收到 JSON 数据时,可以使用 JsonObject 将其解析为 Java 对象,或者在构建 HTTP 响应时,将 Java 对象转换为 JSON 字符串格式。

3.3.2.代码实现

(1)在项目 A 和项目 B 的 pom.xml 文件中引入如下依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>

(2)在项目 A 的配置文件 application.yml 中添加第二种方式的 url:

server:
  port: 8080

rpc:
  url: http://localhost:8081/employ/info
  url2: http://localhost:8081/employ/info/jsonobject

(3)项目 A 的 RPCController.java中添加如下代码:

@Value("${rpc.url2}")
private String URL2;

/**
 * @description: 模拟通过调用项目 B 的接口来根据员工 id 和 name 获取员工的其它信息
 * @param id 员工 id
 * @param name 员工姓名
 * @return: 员工信息
 * */
@PostMapping("/jsonobject")
public String getEmpInfoByJsonObject(String id, String name) {
    //设置请求头,特别是 Content-Type 和 Accept 头
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

    //构建 JsonObject 对象
    JsonObject jsonObject = new JsonObject();
    jsonObject.addProperty("id", id);
    jsonObject.addProperty("name", name);

    //设置请求体,即要发送的员工信息 JSON 字符串
    HttpEntity<String> requestEntity = new HttpEntity<>(jsonObject.toString(), headers);

    //发送 POST 请求,并接收返回的 JSON 结果
    ResponseEntity<String> responseEntity = restTemplate.exchange(URL2, HttpMethod.POST, requestEntity, String.class);
    //获取响应体
    return responseEntity.getBody();
}

(4)项目 B 的 EmployeeController.java中添加如下代码:

@PostMapping("/info/jsonobject")
public ResponseEntity<String> getEmpInfoByJsonObject(@RequestBody String requestBody) {
    //使用 Gson 解析 JSON 字符串为 JsonObject
    JsonObject jsonObject = new Gson().fromJson(requestBody, JsonObject.class);

    //从 JsonObject 中获取需要的员工信息
    String id = jsonObject.get("id").getAsString();
    String name = jsonObject.get("name").getAsString();

    //构建返回的 JSON 字符串
    JsonObject responseJson = new JsonObject();
    responseJson.addProperty("id", id);
    responseJson.addProperty("name", name);
    responseJson.addProperty("posName", "软件开发工程师2");
    responseJson.addProperty("jobLevelName", "高级2");
    responseJson.addProperty("departmentName", "软件开发部2");

    //返回 JSON 格式的响应
    return new ResponseEntity<>(responseJson.toString(), HttpStatus.OK);
}

(5)测试:启动项目 A 和 B 后,在 Postman 中进行接口测试(注意是 POST 请求):

http://localhost:8080/rpc/jsonobject

在这里插入图片描述

3.4.其它说明

RestTemplate 是 Spring Framework 提供的一个用于访问 RESTful 服务的模板类,它提供了多种方法来发送 HTTP 请求并处理响应。其中涉及到的两个方法 exchange()postForObject() 在功能和使用上有一些区别:

3.4.1.restTemplate.exchange()

(1)exchange() 方法是 RestTemplate 提供的通用方法,用于执行 HTTP 请求并返回 ResponseEntity 对象。它支持所有 HTTP 方法(GET、POST、PUT、DELETE 等),并允许指定请求的 URL、HTTP 方法、请求头、请求体和响应类型等。主要特点包括:

  • 通用性:支持所有的 HTTP 方法。
  • 返回类型:返回 ResponseEntity<T>,其中 T 是请求返回的对象类型。
  • 参数:可以设置请求的 URL、HTTP 方法、请求体、请求头等。
  • 灵活性:可以处理各种复杂的 HTTP 请求和响应情况。

(2)使用示例:

ResponseEntity<User> response = restTemplate.exchange(
    "http://api.example.com/users/{id}",
    HttpMethod.GET,
    null,
    User.class,
    1);
User user = response.getBody();

3.4.2.restTemplate.postForObject()

(1)postForObject() 方法是 RestTemplate 提供的简化方法,专门用于发送 HTTP POST 请求并返回结果对象。它适用于那些只需要发送 POST 请求并直接获得返回结果的场景。主要特点包括:

  • HTTP 方法:固定为 POST 方法。
  • 返回类型:直接返回请求的对象类型,而不是 ResponseEntity
  • 参数:可以设置请求的 URL、请求体和返回对象的类型。

(2)使用示例:

User newUser = new User("John", 30);
User createdUser = restTemplate.postForObject(
    "http://api.example.com/users",
    newUser,
    User.class);

在这个示例中,postForObject() 方法发送了一个 POST 请求到 http://api.example.com/users,并将 newUser 对象作为请求体发送,期望返回一个 User 类型的对象作为响应结果。

3.4.3.区别总结

  • 功能exchange() 更通用,支持所有 HTTP 方法;postForObject() 专门用于发送 POST 请求。
  • 返回类型exchange() 返回 ResponseEntity<T>,可以获取完整的 HTTP 响应信息;postForObject() 直接返回请求的对象类型,简化了结果处理。
  • 使用场景:如果需要更多的 HTTP 控制和灵活性,或者处理非 POST 请求,可以使用 exchange();如果只需简单地发送 POST 请求并获得结果对象,可以使用 postForObject()

根据具体的需求和场景选择合适的方法来使用 RestTemplate,可以更高效地与 RESTful 服务进行交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】Java学生成绩管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Ubuntu 18.04,调整字体大小, 隐藏GNOME顶部状态栏

先安装 sudo apt-get install gnome-tweak-tool sudo apt install gnome-shell-extensions 安装后出现这个界面 这里可以调整字体大小 安装工具扩展&#xff1a; sudo apt-get install gnome-shell-extension-autohidetopbar 这里可以出现设置项 打开&#xff0c;并且…

【Altium Designer】Details Net has only one pin (Pin U1-12) 解决办法

报错图&#xff1a; 报错含义&#xff1a; Details Net has only one pin (Pin U1-12) 引脚label没接其他元器件。 解决办法1 修改报告提示&#xff0c;将“错误”改为“不报告”&#xff0c;如下图&#xff0c;在工程上 右键>>工程选项>>找到相应的错误标签提示…

个人主体的小程序可以变更为企业主体吗?

小程序迁移变更主体有什么作用&#xff1f;长期以来&#xff0c;由于部分小程序在注册时&#xff0c;主体不准确的历史原因&#xff0c;或者小程序的主体发生合并、分立或业务调整等现实状况&#xff0c;在小程序登记主体不能对应实际运营人的情况下&#xff0c;导致账号在认证…

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…

【MongoDB数据库之未授权漏洞】

步骤一&#xff1a; 在Kali上执行以下命令搭建起MongoDB的漏洞环境.. 拉取mongo(3.6.6版本)镜像 docker pull mongo:3.6.6 启动镜像 docker run --name mongo-master -p 27017:27017 -d mongo:3.6.6 查看镜像 docker ps 步骤二&#xff1a;使用Nmap的插件脚本进行扫描..发现…

RIR转换Revit尺寸标注和值到Rhino指定图层中

RIR转换Revit尺寸标注和值到Rhino指定图层中 1、使用新增的Dimension Properties节点&#xff0c;获取尺寸标注的线和文字 2、通过elefont包的节点&#xff0c;将起按指定图层bake到rhino中 3、funbim v0.6.4版本节点包已更新到food4rhino&#xff0c;欢迎下载试用

平安养老险宿州中支参加中国特色金融文化“我在行动”演讲比赛

为积极培育和弘扬以“五要五不”为核心的中国特色金融文化&#xff0c;积极传播保险行业正能量&#xff0c;7月30日&#xff0c;由宿州市保险行业协会主办的培育和弘扬中国特色金融文化“我在行动”演讲比赛拉开帷幕。本次演讲比赛共有16位选手参与&#xff0c;平安养老保险股份…

社区检测算法(Community Detection)总结

社区检测(Community Detection) 社区检测&#xff08;Community Detection&#xff09;又被称为是社区发现。它是用来揭示网络聚集行为的一种技术。 社区检测算法用于评估节点组如何聚类或分区&#xff0c;以及它们增强或分离的趋势。 社区 社区是许多网络的属性&#xff0c;…

运维团队可视化大屏定制指南

在运维工作中&#xff0c;可视化大屏作为实时监控和数据分析的重要工具&#xff0c;其直观性和灵活性对于提高运维效率和决策质量至关重要。本文将结合运维行业的特点&#xff0c;为运维团队提供可视化大屏定制化的参考指南。 一、可视化大屏的默认配置与定制化需求 可视化大屏…

java 如何查看jar版本冲突,如何查看哪个模块依赖冲突,idea查看jar包冲突

1. idea 下载插件&#xff1a; 2. 如上图所示&#xff0c;下载Maven Helper, 注意是maven helper 不是别的 3.重启idea 4.点击pom文件&#xff0c;然后点击如图所示&#xff1a; 5. 如此即可查到&#xff0c;某个jar包 都有哪个模块依赖&#xff0c;使用的什么版本&#xff0…

由浅入深的了解进程(6)---地址空间

地址空间 进程的地址空间1、直接代码展示的现象2、基本理解3、细节问题3、1、独立性细节3、2、地址空间细节 4、问题回溯5、Linux2.6内核进程调度队列 进程的地址空间 1、直接代码展示的现象 其中当父子进程之间的g_val改变之后&#xff0c;为什么即使是不同的值了之后&#x…

网络通信模型

网络IO的通信原理 首先&#xff0c;对于TCP通信来说&#xff0c;每个TCP Socket的内核中都有一个发送缓冲区和一个接收缓冲区 接收缓冲区把数据缓存到内核&#xff0c;若应用进程一直没有调用Socket的read方法进行读取&#xff0c;那么该数据会一 直被缓存在接收缓冲区内。不管…

防火墙基础配置

需求&#xff1a; AR1可ping防火墙FW1的G0/0/0口 AR1、AR2、AR3在不同区域 AR1可访问AR2 实现&#xff1a; 配置各路由器的IP地址、静态路由 FW配置策略并将端口加入相关区域 防火墙代码如下&#xff1a; interface GigabitEthernet0/0/0undo shutdownip address 1.1.1.…

通俗易懂!495页看漫画学Python入门教程(全彩版)Git首发破万Star

前言 在编程的世界里&#xff0c;Python无疑是一颗璀璨的明星。从最初作为打发圣诞节闲暇时间的项目&#xff0c;到如今成为最受欢迎的程序设计语言之一&#xff0c;Python以其简洁、易学、强大的特点吸引了无数编程爱好者。然而&#xff0c;对于初学者来说&#xff0c;编程的…

高效转换,尽在掌握 —— 介绍这款免费的PDF转Word在线工具

引言 在日常工作中&#xff0c;我们经常会遇到需要将PDF文件转换成Word文档的情况。无论是为了编辑文档内容还是进行格式调整&#xff0c;一款好用的转换工具都是必不可少的。今天&#xff0c;我们将为大家推荐一款简单易用、功能强大的在线PDF转Word工具——AI智慧引擎&#…

浅谈KMP算法(c++)

目录 前缀函数应用【模板】KMP题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例 1 解释数据规模与约定 思路AC代码 本质不同子串数 例题讲解[NOI2014] 动物园题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 [POI2006] OKR-Periods of …

使用 vLLM 为多个 LoRA 适配器提供服务

欢迎来到雲闪世界。使用 LoRA 适配器&#xff0c;我们可以针对某项任务或领域专门设计大型语言模型 (LLM)。适配器必须加载到 LLM 之上才能用于推理。对于某些应用&#xff0c;为用户提供多个适配器可能会很有用。例如&#xff0c;一个适配器可以执行函数调用&#xff0c;另一个…

【Android Studio】 创建第一个Android应用HelloWorld

文章目录 创建项目查看AndroidManifest.xml&#xff08;清单&#xff09;查看MainActivity.java&#xff08;Activity&#xff09;查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml&#xff08;清单&#xff09; 查看MainActivity.java&#xff08;Activity&…

HarmonyOS NEXT Developer Beta2 端云一体化 运行报错

HarmonyOS NEXT Developer Beta2 端云一体化 运行报错 1 错误提示&#xff1a;Before launch task execute failed! details: npm install failed! 如上图所示&#xff1a; 错误原因&#xff1a; 右击“cloudfunctions”目录&#xff0c;选择“Debug Cloud Functions” 或 “…