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…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
