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…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...