SpringBoot调用外部接口的几种方式
SpringBoot调用外部接口的几种方式
- 使用FeignClient调用
- 1、在使用方引入依赖
- 2、服务接口调用方
- 2.1、在启动类上加上@EnableFeigncliens注解
- 2.2、编写Feign接口调用服务controller层
- 2.3、服务接口调用service层
- 3、服务接口提供者
- 4、说明
- 使用RestTemplate调用
- 1、引入依赖
- 2、RestTemplateConfig配置类
- 3、接口调用
- 使用WebClient调用
- 1、引入依赖
- 2、接口调用示例
- 使用Apache HttpClient调用
- 使用HttpURLConnection调用
- 使用OkHttp调用
- 1、引入依赖
- 2、示例代码
- 使用AsyncHttpClient调用
- 1、引入依赖
- 2、示例代码
使用FeignClient调用
FeignClient调用大多用于微服务开发中,各服务之间的接口调用。它以Java接口注解的方式调用HTTP请求,使服务间的调用变得简单
1、在使用方引入依赖
<!-- Feign注解 这里openFeign的版本要和自己使用的SpringBoot匹配-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><!-- <version>4.0.1</version> -->
</dependency>
2、服务接口调用方
2.1、在启动类上加上@EnableFeigncliens注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableFeignClients
public class StudyfeignApplication {public static void main(String[] args) {SpringApplication.run(StudyfeignApplication.class, args);System.out.println("项目启动成功");}}
2.2、编写Feign接口调用服务controller层
import com.hysoft.studyfeign.service.SysUserClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("feign")
public class SysUserController {@Autowiredprivate SysUserClient sysUserClient;@PostMapping("getUserId")public void getUserId(String userId){this.sysUserClient.getUserById(userId);}}
2.3、服务接口调用service层
feign的客户端需要使用@FeignClient注解进行表示,这样扫描时才知道这是一个feign客户端。@FeignClient最常用的就两个属性,一个name,用于给客户端定义一个唯一的名称,另一个就是url,用于定义该客户端调用的远程地址。url中的内容,可以写在配置文件application.yml中,便于管理
@Service
@FeignClient(name = "feign-service",url = "${master-getuserbyId}")
public interface SysUserClient {@PostMapping("/master/test")String getUserById(String id);}
application.yml中的配置如下
server:port: 8081
master-getuserbyId: http://localhost:8080
3、服务接口提供者
对于接口提供者来说没有特别要求,和正常的接口开发一样
4、说明
需要说明的是,在接口调用方,可以继续拓展service层,书写service实现层,进一步进行拓展
import org.springframework.stereotype.Service;@Service
public class SysUserClientImpl implements SysUserClient{@Overridepublic String getUserById(String id) {return "";}
}
使用RestTemplate调用
RestTemplate中几个常用的方法:getForObject()、getForEntity()、postForObject()、postForEntity()。其中,getForObject() 和 getForEntity() 方法可以用来发送 GET 请求
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
2、RestTemplateConfig配置类
SimpleClientHttpRequestFactory类对应的HTTP库是JDK自带的HttpUrlConnection,当然我们可以根据自身的需求使用其他的HTTP库,例如HttpComponentsAsyncClientHttpRequestFactory
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);}@Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setReadTimeout(5000);//单位为msfactory.setConnectTimeout(5000);//单位为msreturn factory;}
}
3、接口调用
@RestController
public class TestRestTemplate {@Resourceprivate RestTemplate restTemplate;@GetMapping(value = "/saveUser")public void saveUser(String userId) {String url = "http://127.0.0.1:8080/master/test";Map map = new HashMap<>();map.put("userId", "hy001");String results = restTemplate.postForObject(url, map, String.class);}}
使用WebClient调用
Spring3.0引入了RestTemplate,但是在后来的官方源码中介绍,RestTemplate有可能在未来的版本中被弃用,所谓替代RestTemplate,在Spring5中引入了WebClient作为异步的非阻塞、响应式的HTTP客户端。
1、引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
2、接口调用示例
public class TestWebClient {@Testpublic void doGet() {String userId = "郭郭";String url = "http://127.0.0.1:8080/master/test/getSysUserById?userId={userId}";Mono<String> mono = WebClient//创建WebClient实例.create()//方法调用,WebClient中提供了多种方法.get()//请求url.uri(url, userId)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果:block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println("响应结果:" + mono.block());}@Testpublic void doPost() {Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);String url = "http://127.0.0.1:8080/master/test/saveUser";Mono<String> mono = WebClient//创建WebClient实例.create()//方法调用,WebClient中提供了多种方法.post()//请求url.uri(url)//指定请求的Content-Type为JSON.contentType(MediaType.APPLICATION_JSON)//使用bodyValue方法传递请求体.bodyValue(requestBody)//获取响应结果.retrieve()//将结果转换为指定类型.bodyToMono(String.class);//返回最终结果:block是阻塞的/subscribe()非阻塞式获取响应结果System.out.println("响应结果:" + mono.block());}
}
在上述doPost请求中,我们的请求接口入参是一个Map,但是需要转换为JSON格式传递,这是因为WebClient默认是使用JSON序列化的。
使用Apache HttpClient调用
public class TestHttpClient {@Testpublic void doGet() throws IOException {//步骤一:创建httpClient实例CloseableHttpClient httpClient = HttpClients.createDefault();//步骤二:创建HTTP请求HttpGet httpGet = new HttpGet("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=郭郭");//步骤三:发送请求并获取响应数据CloseableHttpResponse response = httpClient.execute(httpGet);//步骤四:处理响应数据HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity);//步骤五:关闭httpClient和responseresponse.close();httpClient.close();}@Testpublic void doPost() throws IOException {//步骤一:创建httpClient实例CloseableHttpClient httpClient = HttpClients.createDefault();//步骤二:创建HTTP请求HttpPost httpPost = new HttpPost("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//步骤三:设置请求体数据,使用JSON格式Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);StringEntity stringEntity = new StringEntity(requestBody, "UTF-8");stringEntity.setContentType("application/json");httpPost.setEntity(stringEntity);//步骤四:发送请求并获取响应数据CloseableHttpResponse response = httpClient.execute(httpPost);//步骤五:处理响应数据HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity);//步骤五:关闭httpClient和responseresponse.close();httpClient.close();}
}
使用HttpURLConnection调用
public class TestHttpURLConnection {@Testpublic void doGet() throws IOException {String userId = "郭郭"; // 参数值userId = URLEncoder.encode(userId, "UTF-8"); // 对参数值进行URL编码//步骤一:创建URL对象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/getSysUserById?userId=" + userId);//步骤二:打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//步骤三:设置请求方式conn.setRequestMethod("GET");//步骤四:读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} @Testpublic void doPost() throws IOException {//创建URL对象URL url = new URL("http://127.0.0.1:8094/masterdata/sysUser/saveUser");//打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置请求方式conn.setRequestMethod("POST");// 设置请求头conn.setRequestProperty("Content-Type", "application/json");//启用输出流conn.setDoOutput(true);//设置请求体数据Map map = new HashMap<>();map.put("name", "郭郭");String requestBody = JSON.toJSONString(map);//发送请求体数据try (DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream())) {outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));}//读取响应内容BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));StringBuilder sb = new StringBuilder();String line;while ((line = reader.readLine()) != null) {sb.append(line);}reader.close();System.out.println(sb.toString());} }
使用OkHttp调用
1、引入依赖
<!--okhttp依赖--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.0.0</version></dependency>
2、示例代码
public class TestOkHttp {@Testpublic void doGet() throws IOException {OkHttpClient client = new OkHttpClient();String url = "http://127.0.0.1:8080/master/test/getSysUserById?userId=郭郭";Request request = new Request.Builder().url(url).build();try (Response response = client.newCall(request).execute()) {ResponseBody body = response.body();System.out.println(body.string());}}@Testpublic void doPost() throws IOException{OkHttpClient client = new OkHttpClient();String url = "http://127.0.0.1:8080/master/test/saveUser";MediaType mediaType = MediaType.get("application/json; charset=utf-8");//requestBody请求入参Map map = new HashMap<>();map.put("name", "admin");RequestBody requestBody = RequestBody.create(mediaType, JSON.toJSONString(map));Request request = new Request.Builder().url(url).post(requestBody).build();try (Response response = client.newCall(request).execute()) {ResponseBody body = response.body();System.out.println(body.string());}}
}
使用AsyncHttpClient调用
1、引入依赖
<dependency><groupId>org.asynchttpclient</groupId><artifactId>async-http-client</artifactId><version>2.12.3</version>
</dependency>
2、示例代码
public class TestAsyncHttpClient {@Testpublic void doGet() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.prepareGet("http://127.0.0.1:8080/master/test/getSysUserById?userId=hy001");CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}@Testpublic void doPost() throws IOException {try (AsyncHttpClient client = new DefaultAsyncHttpClient();) {BoundRequestBuilder requestBuilder = client.preparePost("http://127.0.0.1:8094/8080/master/test/saveUser");//requestBody请求入参Map map = new HashMap<>();map.put("name", "admin");String requestBody = JSON.toJSONString(map);requestBuilder.addHeader("Content-Type", "application/json");requestBuilder.setBody(requestBody);CompletableFuture<String> future = requestBuilder.execute().toCompletableFuture().thenApply(Response::getResponseBody);//使用join等待响应完成String responseBody = future.join();System.out.println(responseBody);}}}
相关文章:
SpringBoot调用外部接口的几种方式
SpringBoot调用外部接口的几种方式 使用FeignClient调用1、在使用方引入依赖2、服务接口调用方2.1、在启动类上加上EnableFeigncliens注解2.2、编写Feign接口调用服务controller层2.3、服务接口调用service层 3、服务接口提供者4、说明 使用RestTemplate调用1、引入依赖2、Rest…...
MySQL:information_schema查找某个表的主键是否在数据的其他位置出现之二
上一篇: MySQL:information_schema查找某个表的主键是否在数据的其他位置出现之一-CSDN博客 摘要 遍历数据库每一张表的每一个字段,是否存在字符串search_term 正文 源码 import pymysql from datetime import datetime# 测试函数 if __n…...
Linux进程和计划任务管理
目录 一、进程基本概念 1.进程 2.程序和进程的关系 二、查看进程信息 1.ps命令 1.1 ps aux命令 1.2 ps -elf 命令 2. top 命令 3.pgrep 命令 4.jobs 命令 三、查看进程树 四、进程的启动方式 1.手动启动 2.调度启动 五、终止进程的运行 1.CtrlC组合键 2.kill、kil…...
【Angular18】封装自定义组件
1. 准备组件 2. 创建打包文件夹及部分配置文件 创建 文件夹app-legalentities-root拷贝组件源文件到新的文件夹app-legalentities中创建文件 .npmrc registry发布地址always-authtrue创建文件 ng-package.json {"$schema": "./node_modules/ng-packagr/ng-pac…...
【流媒体】RTMPDump—RTMP_ConnectStream(创建流连接)
目录 1. RTMP_ConnectStream函数1.1 读取packet(RTMP_ReadPacket)1.2 解析packet(RTMP_ClientPacket)1.2.1 设置Chunk Size(HandleChangeChunkSize)1.2.2 用户控制信息(HandleCtrl)1…...
MySQL学习3之锁机制
一、什么是锁粒度? 锁粒度(Lock Granularity)是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围,即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。 在MySQL中常见的锁粒度有&am…...
2004-2023年上市公司过度负债数据(含原始数据+计算结果)
2004-2023年上市公司过度负债数据(含原始数据计算结果) 1、时间:2004-2023年 2、来源:上市公司年报 3、指标:证券代码、证券简称、统计截止日期、是否剔除ST或*ST股、是否剔除当年新上市、已经退市或被暂停退市的公…...
[机器学习]--KNN算法(K邻近算法)
KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…...
跨平台控制神器Escrcpy,您的智能生活助手
Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件,它允许用户将 Android 手机屏幕实时镜像到电脑上,并使用电脑的鼠标和键盘直接操作手机,实现了无线且高效的操控。这款软件是免费开源的,支持跨平台使用,包…...
AR 眼镜之-开关机定制-实现方案
目录 📂 前言 AR 眼镜系统版本 开关机定制 1. 🔱 技术方案 1.1 技术方案概述 1.2 实现方案 1)开机 Logo 2)开机音效 3)开机动画 4)关机动画 5)关机弹窗 2. 💠 开机 Logo…...
论文阅读-Transformer Layers as Painters
1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务,但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响,本文设计了一系列的实验。通过实验表明,预训练语言模型中的lower和final layers与中间层分布不一致…...
【STL】vector模拟实现
vector引入 vector的实现主要依靠三个成员变量:start,finish和end_of_storage 其中: [start]指向容器中的起始位置 [finish]指向容器中最后一个有效数据的下一个位置 [end_of_storage]指向容器中现有容量的位置 通过这三个指针,就使得vector的size…...
静态成员static关键字
定义: 静态成员在C类中是一个重要的概念,它包括静态成员变量和静态成员函数。 静态成员变量 1定义:静态成员变量是类的所有对象共享的变量。与普通成员变量相比,无论创建了多少个类的实 例,静态成员变量只有一份拷贝…...
本地项目git同步到线上
将本地创建的项目同步到你的 GitHub 账号线上仓库,可以按照以下步骤进行操作: 1. 在 GitHub 上创建一个新仓库 登录你的 GitHub 账号。点击右上角的加号(),然后选择 New repository。填写仓库的名称、描述等信息。选…...
Allegro如何导入DXF结构文件并生成板框(1)?
在用Allegro进行PCB设计时,需要导入DXF结构文件,由此来生成PCB的板框。 本节先讲Allegro如何导入DXF结构文件?下节讲如何利用导入的DXF结构文件生成OUTLINE板框。 Allegro如何导入DXF结构文件并生成板框(2)?-CSDN博客 详细操作方法如下: 1、选择菜单栏File 选择Import…...
Word密码忘记怎么办?三个密码找回工具帮你轻松找回密码
在工作当中,为了保护文档内容的安全,我们时常会设置密码。但有时会因为长时间未打开而忘记了密码,导致word文档无法打开。面对这种情况,我们该怎么办呢?下面小编就将给大家带来3个实用的密码找回工具,帮助大…...
使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例
使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例项目是一个很好的方式来学习如何结合高级框架进行开发。ABP 框架提供了强大的模块化和分层架构,适合构建复杂的企业级应用程序。 以下是一个使用 ABP 框架的完整示例项目,它展示了如何创建一个包含 …...
WPF图表控件库
LiveCharts: LiveCharts2预览版、内存管理不是很好,长时间持续更新的情况下,内存溢出,慎用 数据加载量不能太大(1000点左右 开始卡) 第一步:下载LiveChart NuGet包 第二步:引用&a…...
JAVA-WEB资源配置
用JAVA进行编写WEB项目时,我们一般需要对WEB进行统一配置,例如制定拦截路径、页面解析器、跨域配置、fastjson报文解析、文件上传大小配置等。 Getter Setter Configuration public class WebConfiguration extends WebMvcConfigurationSupport {priva…...
分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
