Java调用第三方接口、http请求详解,一文学会
Java 调用第三方接口的封装方法详解
在开发企业级应用时,调用第三方接口是非常常见的场景。我们可能需要与外部服务集成,如支付接口、短信接口、天气服务接口等。为了提高代码的可维护性、复用性和易扩展性,封装第三方接口调用的方法非常重要。
本文将详细介绍如何封装一个 Java 调用第三方接口的通用方法,确保代码具有良好的可读性和扩展性。
1. 第三方接口调用的基本步骤
在 Java 中调用第三方接口通常包含以下几个步骤:
- 确定接口 URL:通常接口会提供一个 HTTP/HTTPS 的 URL。
- 传递请求参数:使用
GET
或POST
方法,根据接口文档发送请求参数。 - 发送请求:使用
HttpClient
或HttpURLConnection
发送 HTTP 请求。 - 处理响应:接收并处理返回的 JSON 或 XML 格式的数据。
- 异常处理:捕获和处理网络错误或接口返回的错误。
为了使接口调用的代码更加通用化、简洁化,我们可以通过封装来减少重复代码和提升代码复用性。
2. Java HttpClient 简介
在 Java 11 之后,官方推出了 HttpClient
作为原生的 HTTP 请求工具,替代了旧的 HttpURLConnection
。相比 HttpURLConnection
,HttpClient
提供了更现代化的 API,且支持同步和异步请求。
引入依赖
如果使用的是 Java 11 及其以上版本,HttpClient
已经内置,无需额外依赖。如果你使用的是 Java 8 或之前的版本,则可以使用 Apache HttpClient 或 OkHttp。
3. 封装第三方接口的步骤
我们将以一个常见的 POST
请求为例,封装一个通用的第三方接口调用方法。此方法将支持:
- GET 和 POST 请求。
- 传递请求头和请求体。
- 处理 JSON 响应。
第一步:定义工具类
首先,我们定义一个工具类 HttpUtils
,封装通用的 HTTP 请求方法。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;public class HttpUtils {private static final HttpClient httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)) // 设置连接超时.build();private static final ObjectMapper objectMapper = new ObjectMapper(); // 用于处理JSON/*** 发送GET请求* @param url 请求的URL地址* @param headers 请求头的Map集合* @return 返回响应的结果,JSON格式* @throws Exception 请求失败时抛出异常*/public static String sendGet(String url, Map<String, String> headers) throws Exception {// 创建GET请求HttpRequest.Builder requestBuilder = HttpRequest.newBuilder().uri(URI.create(url)).timeout(Duration.ofSeconds(10)) // 请求超时时间.GET();// 设置请求头if (headers != null) {headers.forEach(requestBuilder::header);}HttpRequest request = requestBuilder.build();// 发送请求并获取响应HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());// 判断响应状态码if (response.statusCode() == 200) {return response.body(); // 返回响应体} else {throw new RuntimeException("GET请求失败,状态码: " + response.statusCode());}}/*** 发送POST请求* @param url 请求的URL地址* @param headers 请求头的Map集合* @param requestBody 请求体,可以是JSON格式的字符串* @return 返回响应的结果,JSON格式* @throws Exception 请求失败时抛出异常*/public static String sendPost(String url, Map<String, String> headers, String requestBody) throws Exception {// 创建POST请求HttpRequest.Builder requestBuilder = HttpRequest.newBuilder().uri(URI.create(url)).timeout(Duration.ofSeconds(10)) // 请求超时时间.POST(HttpRequest.BodyPublishers.ofString(requestBody)); // 设置请求体// 设置请求头if (headers != null) {headers.forEach(requestBuilder::header);}HttpRequest request = requestBuilder.build();// 发送请求并获取响应HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());// 判断响应状态码if (response.statusCode() == 200) {return response.body(); // 返回响应体} else {throw new RuntimeException("POST请求失败,状态码: " + response.statusCode());}}/*** 将对象转换为JSON字符串* @param obj 需要转换的对象* @return 对象的JSON格式字符串* @throws Exception 转换失败时抛出异常*/public static String convertObjectToJson(Object obj) throws Exception {return objectMapper.writeValueAsString(obj);}/*** 将JSON字符串转换为指定类型的对象* @param json JSON字符串* @param clazz 转换后的对象类型* @param <T> 泛型* @return 转换后的对象* @throws Exception 转换失败时抛出异常*/public static <T> T convertJsonToObject(String json, Class<T> clazz) throws Exception {return objectMapper.readValue(json, clazz);}
}
代码说明:
- HttpClient:这是 Java 11 引入的 HTTP 客户端,用于发送 HTTP 请求。我们将其设置为 10 秒的连接超时。
- GET 请求:
sendGet()
方法用于发送 GET 请求,并接受一个 URL 和请求头。 - POST 请求:
sendPost()
方法用于发送 POST 请求,接受 URL、请求头和请求体(通常为 JSON 格式的字符串)。 - JSON 处理:
ObjectMapper
用于将对象与 JSON 字符串之间相互转换,便于发送和解析 JSON 格式数据。
4. 使用封装方法调用第三方接口
封装好工具类后,我们可以通过简单的调用来处理第三方接口请求。假设我们要调用一个天气服务的 API,获取指定城市的天气数据。
调用示例
import java.util.HashMap;
import java.util.Map;public class WeatherService {// 示例:获取天气信息public static void getWeather(String cityName) {String url = "https://api.weather.com/v3/wx/conditions/current"; // 第三方API的URL// 请求头信息Map<String, String> headers = new HashMap<>();headers.put("Content-Type", "application/json");headers.put("Authorization", "Bearer your_api_key");try {// 调用GET请求String response = HttpUtils.sendGet(url + "?city=" + cityName, headers);// 解析返回的JSON结果WeatherResponse weather = HttpUtils.convertJsonToObject(response, WeatherResponse.class);// 打印天气信息System.out.println("当前温度:" + weather.getTemperature());} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {// 调用获取天气的方法getWeather("Beijing");}
}// WeatherResponse 类用于接收解析后的 JSON 响应
class WeatherResponse {private double temperature;public double getTemperature() {return temperature;}public void setTemperature(double temperature) {this.temperature = temperature;}
}
代码说明:
- 请求头:我们设置了
Content-Type
和Authorization
请求头,用于标识请求的数据格式和认证信息。 - 调用工具类方法:通过
HttpUtils.sendGet()
发送 GET 请求,并将响应结果转换为自定义的WeatherResponse
对象。 - 解析 JSON:
HttpUtils.convertJsonToObject()
将返回的 JSON 字符串转换为 Java 对象。
5. 错误处理与重试机制
在实际项目中,第三方接口调用可能会出现超时、网络故障等问题。为了提高接口调用的稳定性,通常会增加错误处理和重试机制。我们可以在封装的工具类中添加重试逻辑:
public static String sendGetWithRetry(String url, Map<String, String> headers, int maxRetries) throws Exception {int retryCount = 0;while (retryCount < maxRetries) {try {return sendGet(url, headers); // 尝试发送请求} catch (Exception e) {retryCount++;if (retryCount >= maxRetries) {throw new RuntimeException("GET请求失败,重试次数:" + retryCount, e);}System.out.println("请求失败,正在重试...(" + retryCount + ")");Thread.sleep(1000); // 暂停一秒再重试}}return null;
}
6. 总结
封装第三方接口的调用不仅可以提高代码的复用性,还能降低出错的概率。在本文中,我们使用 Java 11 的 HttpClient
封装了 GET 和 POST 请求的通用方法,并提供了 JSON 的处理能力。通过这种方式,你可以轻松地调用和扩展任何第三方 API,适用于各种应用场景。
希望通过这篇文章,大家能学会如何封装第三方接口调用方法,并将其应用到实际项目中。
相关文章:
Java调用第三方接口、http请求详解,一文学会
Java 调用第三方接口的封装方法详解 在开发企业级应用时,调用第三方接口是非常常见的场景。我们可能需要与外部服务集成,如支付接口、短信接口、天气服务接口等。为了提高代码的可维护性、复用性和易扩展性,封装第三方接口调用的方法非常重要…...

windows10使用bat脚本安装前后端环境之redis注册服务
首先需要搞清楚redis在本地是怎么安装配置、然后在根据如下步骤编写bat脚本: 思路 1.下载zip格式redis 2.查看windows server服务是否已安装redis 3.启动查看服务是否正常 bat脚本 echo off echo windows10 x64 server redis init REM 请求管理员权限并隐藏窗口 …...

fastapp-微信开发GPT项目第一课
0. 开发说明 在学习开发本项目之前,必须保证有以下知识储备和环境工具。 技术栈说明python>3.9、pydantic>2.7.1python基础,http协议fastapi>0.111.0web协程异步框架,有web开发基础,异步编程,类型标注[pyth…...

在双十一必买的好物有哪些?2024年双十一好物清单分享
一年一度的双十一购物狂欢节再次悄然临近,它不仅是一场购物的盛宴,更是我们提前规划生活、享受优惠的绝佳时机,在这个全民狂欢的日子里,各大品牌纷纷亮出杀手锏,推出年度最给力的优惠和新品,让人目不暇接&a…...

避免glibc版本而报错,CentOS等Linux安装node.js完美方法
概述 对于Node.js v18.x或更高,Node.js官方默认是在Ubuntu 20.04, Debian 10, RHEL 8,CentOS 8等高版操作系统上编译得到的,高版本操作系统的glibc版本≥2.28。所以,下载Node.js后,也需要glibc版本≥2.28才能使用。 而CentOS 7.x等…...
elasticsearch实战应用
Elasticsearch是一个基于Lucene的分布式、实时全文搜索引擎,广泛应用于日志收集和可视化、数据分析以及大规模数据检索等领域。其强大的搜索和分析能力,使得Elasticsearch成为许多企业和开发者在处理大规模数据时的首选工具。以下将从Elasticsearch的实战…...

STM32精确控制步进电机
目的:学习使用STM32电机驱动器步进电机,进行电机运动精确控制。 测试环境: MCU主控芯片STM32F103RCT6 ;A4988步进电机驱动器模块; 微型2相4线步…...

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动
文章目录 1、 buildroot源码获取2、buildroot配置3、buildroot编译4、挂载根文件系统 在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂…...

光控资本:10转10送10股有多少股?转股与送股又什么区别?
10转10送10股是投资者每10股转增10股并送10股,即每10股添加20股,变为30股。 例如,某投资者有1000股,上市公司10转10送10后,投资者将添加2000股,手中持有股票变为3000股。 上市公司进行10转10送10股之后&a…...

【音乐格式转换攻略】6个好用的音乐转换成mp3格式技巧!
现如今,不少用户在将手机下载的歌曲转移到其他设备,如MP3播放器、车载音响或智能音箱时,却遭遇了兼容性难题。尤其是面对一些特殊音频格式,只能在各自的平台播放器上正常播放,一旦尝试在其他设备上打开,往往…...

蓝桥杯15届C/C++B组省赛题目
问题描述 小蓝组织了一场算法交流会议,总共有 5050 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 77 个人,这 77 人彼此之间没有进行握手 (但这 77 人与…...

感悟:糟糠之妻不下堂和现在女性觉醒的关系
古人说“糟糠之妻不下堂”真是害惨了中国女性,古代之所以有这一说法,大概是因为男子可以三妻四妾,妻子永远是正妻,也不需要讲究什么从一而终,更不会讲什么男德,只会要求女性学习女德、女训之类,…...

Linux网络之UDP与TCP协议详解
文章目录 UDP协议UDP协议数据报报头 TCP协议确认应答缓冲区 超时重传三次握手其他问题 四次挥手滑动窗口流量控制拥塞控制 UDP协议 前面我们只是说了UDP协议的用法,但是并没有涉及到UDP协议的原理 毕竟知道冰箱的用法和知道冰箱的原理是两个层级的事情 我们首先知道计算机网…...

K8S:开源容器编排平台,助力高效稳定的容器化应用管理
云计算de小白 Kubernetes(简称K8s)是一个开源容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 K8S诞生于Google,基于其多年在生产环境运行容器的经验,目前已成为现代微服务架构和云原生应用的核心技术。 图…...

STM32嵌入式编程学习到提高:【4】UART串口打印
------------------------------------------------------------------------------------------------------------------------- 工程文件:放在百度云盘里,需要的自行下载!!! 链接: https://pan.baidu.com/s/14gRne…...
C 标准库 - <ctype.h>
C 标准库 - <ctype.h> 概述 <ctype.h> 是 C 语言标准库中的一个头文件,它提供了一系列用于测试和操作字符的函数。这些函数主要用于检查字符是否属于特定的字符类别,如字母、数字、标点符号等,以及进行字符的大小写转换。<ctype.h> 中的函数通常在处理文…...
linux:chown用法详解
文章目录 1. 描述2. 语法3. 参数4. 例子 1. 描述 chown 是 Linux 中用于更改文件或目录的所有者和所有者组的命令。 2. 语法 chown [选项] 所有者[:组] 文件名详细用法: Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...or: chown [OPTION]... --reference…...

介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型
openai o1介绍 一、官方技术报告要点剖析实验1 benchmark分析实验2:和phd比赛技术细节:Chain of Thought的使用人类偏好评估Human preference evaluationsatety技术细节:隐藏思维链为监控模型提供了机会:)openai的几点conclusion 二、官方介绍剖析 Intro…...

2024 Python3.10 系统入门+进阶(十六):正则表达式
目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…...

书生大模型实战营学习[7] InternLM + LlamaIndex RAG 实践
环境配置 选择30%A100做本次任务 conda create -n llamaindex python3.10 conda activate llamaindex conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.7 -c pytorch -c nvidia pip install einops pip install protobuf安装Llamaindex cond…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...