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

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查找某个表的主键是否在数据的其他位置出现之二

上一篇&#xff1a; MySQL&#xff1a;information_schema查找某个表的主键是否在数据的其他位置出现之一-CSDN博客 摘要 遍历数据库每一张表的每一个字段&#xff0c;是否存在字符串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&#xff08;RTMP_ReadPacket&#xff09;1.2 解析packet&#xff08;RTMP_ClientPacket&#xff09;1.2.1 设置Chunk Size&#xff08;HandleChangeChunkSize&#xff09;1.2.2 用户控制信息&#xff08;HandleCtrl&#xff09;1…...

MySQL学习3之锁机制

一、什么是锁粒度&#xff1f; 锁粒度&#xff08;Lock Granularity&#xff09;是指在数据库中锁定数据资源的最小单位。锁粒度决定了锁定操作的范围&#xff0c;即锁定的是整个数据库、整个表、表中的某个分区、表中的某一页还是表中的某一行。 在MySQL中常见的锁粒度有&am…...

2004-2023年上市公司过度负债数据(含原始数据+计算结果)

2004-2023年上市公司过度负债数据&#xff08;含原始数据计算结果&#xff09; 1、时间&#xff1a;2004-2023年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否剔除ST或*ST股、是否剔除当年新上市、已经退市或被暂停退市的公…...

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…...

跨平台控制神器Escrcpy,您的智能生活助手

Escrcpy 是一款基于 Scrcpy 开发的图形化安卓手机投屏控制软件&#xff0c;它允许用户将 Android 手机屏幕实时镜像到电脑上&#xff0c;并使用电脑的鼠标和键盘直接操作手机&#xff0c;实现了无线且高效的操控。这款软件是免费开源的&#xff0c;支持跨平台使用&#xff0c;包…...

AR 眼镜之-开关机定制-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 开关机定制 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;开机 Logo 2&#xff09;开机音效 3&#xff09;开机动画 4&#xff09;关机动画 5&#xff09;关机弹窗 2. &#x1f4a0; 开机 Logo…...

论文阅读-Transformer Layers as Painters

1. 摘要 尽管大语言模型现在已经被广泛的应用于各种任务&#xff0c;但是目前对其并没有一个很好的认知。为了弄清楚删除和重组预训练模型不同层的影响&#xff0c;本文设计了一系列的实验。通过实验表明&#xff0c;预训练语言模型中的lower和final layers与中间层分布不一致…...

【STL】vector模拟实现

vector引入 ​​ vector的实现主要依靠三个成员变量:start,finish和end_of_storage 其中&#xff1a; [start]指向容器中的起始位置 [finish]指向容器中最后一个有效数据的下一个位置 [end_of_storage]指向容器中现有容量的位置 通过这三个指针&#xff0c;就使得vector的size…...

静态成员static关键字

定义&#xff1a; 静态成员在C类中是一个重要的概念&#xff0c;它包括静态成员变量和静态成员函数。 静态成员变量 1定义&#xff1a;静态成员变量是类的所有对象共享的变量。与普通成员变量相比&#xff0c;无论创建了多少个类的实 例&#xff0c;静态成员变量只有一份拷贝…...

本地项目git同步到线上

将本地创建的项目同步到你的 GitHub 账号线上仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 在 GitHub 上创建一个新仓库 登录你的 GitHub 账号。点击右上角的加号&#xff08;&#xff09;&#xff0c;然后选择 New repository。填写仓库的名称、描述等信息。选…...

Allegro如何导入DXF结构文件并生成板框(1)?

在用Allegro进行PCB设计时,需要导入DXF结构文件,由此来生成PCB的板框。 本节先讲Allegro如何导入DXF结构文件?下节讲如何利用导入的DXF结构文件生成OUTLINE板框。 Allegro如何导入DXF结构文件并生成板框(2)?-CSDN博客 详细操作方法如下: 1、选择菜单栏File 选择Import…...

Word密码忘记怎么办?三个密码找回工具帮你轻松找回密码

在工作当中&#xff0c;为了保护文档内容的安全&#xff0c;我们时常会设置密码。但有时会因为长时间未打开而忘记了密码&#xff0c;导致word文档无法打开。面对这种情况&#xff0c;我们该怎么办呢&#xff1f;下面小编就将给大家带来3个实用的密码找回工具&#xff0c;帮助大…...

使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例

使用 ABP 框架 (ASP.NET Boilerplate Project) 创建一个带有迁移功能的示例项目是一个很好的方式来学习如何结合高级框架进行开发。ABP 框架提供了强大的模块化和分层架构,适合构建复杂的企业级应用程序。 以下是一个使用 ABP 框架的完整示例项目,它展示了如何创建一个包含 …...

WPF图表控件库

LiveCharts&#xff1a; LiveCharts2预览版、内存管理不是很好&#xff0c;长时间持续更新的情况下&#xff0c;内存溢出&#xff0c;慎用 数据加载量不能太大&#xff08;1000点左右 开始卡&#xff09; 第一步&#xff1a;下载LiveChart NuGet包 第二步&#xff1a;引用&a…...

JAVA-WEB资源配置

用JAVA进行编写WEB项目时&#xff0c;我们一般需要对WEB进行统一配置&#xff0c;例如制定拦截路径、页面解析器、跨域配置、fastjson报文解析、文件上传大小配置等。 Getter Setter Configuration public class WebConfiguration extends WebMvcConfigurationSupport {priva…...

分享一个基于微信小程序的宠物服务中心的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...