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

Java调用第三方接口、http请求详解,一文学会

Java 调用第三方接口的封装方法详解

在开发企业级应用时,调用第三方接口是非常常见的场景。我们可能需要与外部服务集成,如支付接口、短信接口、天气服务接口等。为了提高代码的可维护性、复用性和易扩展性,封装第三方接口调用的方法非常重要。

本文将详细介绍如何封装一个 Java 调用第三方接口的通用方法,确保代码具有良好的可读性和扩展性。


1. 第三方接口调用的基本步骤

在 Java 中调用第三方接口通常包含以下几个步骤:

  1. 确定接口 URL:通常接口会提供一个 HTTP/HTTPS 的 URL。
  2. 传递请求参数:使用 GETPOST 方法,根据接口文档发送请求参数。
  3. 发送请求:使用 HttpClientHttpURLConnection 发送 HTTP 请求。
  4. 处理响应:接收并处理返回的 JSON 或 XML 格式的数据。
  5. 异常处理:捕获和处理网络错误或接口返回的错误。

为了使接口调用的代码更加通用化、简洁化,我们可以通过封装来减少重复代码和提升代码复用性。


2. Java HttpClient 简介

在 Java 11 之后,官方推出了 HttpClient 作为原生的 HTTP 请求工具,替代了旧的 HttpURLConnection。相比 HttpURLConnectionHttpClient 提供了更现代化的 API,且支持同步和异步请求。

引入依赖

如果使用的是 Java 11 及其以上版本,HttpClient 已经内置,无需额外依赖。如果你使用的是 Java 8 或之前的版本,则可以使用 Apache HttpClient 或 OkHttp。


3. 封装第三方接口的步骤

我们将以一个常见的 POST 请求为例,封装一个通用的第三方接口调用方法。此方法将支持:

  • GETPOST 请求。
  • 传递请求头和请求体。
  • 处理 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);}
}
代码说明:
  1. HttpClient:这是 Java 11 引入的 HTTP 客户端,用于发送 HTTP 请求。我们将其设置为 10 秒的连接超时。
  2. GET 请求sendGet() 方法用于发送 GET 请求,并接受一个 URL 和请求头。
  3. POST 请求sendPost() 方法用于发送 POST 请求,接受 URL、请求头和请求体(通常为 JSON 格式的字符串)。
  4. 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;}
}
代码说明:
  1. 请求头:我们设置了 Content-TypeAuthorization 请求头,用于标识请求的数据格式和认证信息。
  2. 调用工具类方法:通过 HttpUtils.sendGet() 发送 GET 请求,并将响应结果转换为自定义的 WeatherResponse 对象。
  3. 解析 JSONHttpUtils.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 调用第三方接口的封装方法详解 在开发企业级应用时&#xff0c;调用第三方接口是非常常见的场景。我们可能需要与外部服务集成&#xff0c;如支付接口、短信接口、天气服务接口等。为了提高代码的可维护性、复用性和易扩展性&#xff0c;封装第三方接口调用的方法非常重要…...

windows10使用bat脚本安装前后端环境之redis注册服务

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

fastapp-微信开发GPT项目第一课

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

在双十一必买的好物有哪些?2024年双十一好物清单分享

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

避免glibc版本而报错,CentOS等Linux安装node.js完美方法

概述 对于Node.js v18.x或更高&#xff0c;Node.js官方默认是在Ubuntu 20.04, Debian 10, RHEL 8,CentOS 8等高版操作系统上编译得到的&#xff0c;高版本操作系统的glibc版本≥2.28。所以&#xff0c;下载Node.js后&#xff0c;也需要glibc版本≥2.28才能使用。 而CentOS 7.x等…...

elasticsearch实战应用

Elasticsearch是一个基于Lucene的分布式、实时全文搜索引擎&#xff0c;广泛应用于日志收集和可视化、数据分析以及大规模数据检索等领域。其强大的搜索和分析能力&#xff0c;使得Elasticsearch成为许多企业和开发者在处理大规模数据时的首选工具。以下将从Elasticsearch的实战…...

STM32精确控制步进电机

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

Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动

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

光控资本:10转10送10股有多少股?转股与送股又什么区别?

10转10送10股是投资者每10股转增10股并送10股&#xff0c;即每10股添加20股&#xff0c;变为30股。 例如&#xff0c;某投资者有1000股&#xff0c;上市公司10转10送10后&#xff0c;投资者将添加2000股&#xff0c;手中持有股票变为3000股。 上市公司进行10转10送10股之后&a…...

【音乐格式转换攻略】6个好用的音乐转换成mp3格式技巧!

现如今&#xff0c;不少用户在将手机下载的歌曲转移到其他设备&#xff0c;如MP3播放器、车载音响或智能音箱时&#xff0c;却遭遇了兼容性难题。尤其是面对一些特殊音频格式&#xff0c;只能在各自的平台播放器上正常播放&#xff0c;一旦尝试在其他设备上打开&#xff0c;往往…...

蓝桥杯15届C/C++B组省赛题目

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

感悟:糟糠之妻不下堂和现在女性觉醒的关系

古人说“糟糠之妻不下堂”真是害惨了中国女性&#xff0c;古代之所以有这一说法&#xff0c;大概是因为男子可以三妻四妾&#xff0c;妻子永远是正妻&#xff0c;也不需要讲究什么从一而终&#xff0c;更不会讲什么男德&#xff0c;只会要求女性学习女德、女训之类&#xff0c;…...

Linux网络之UDP与TCP协议详解

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

K8S:开源容器编排平台,助力高效稳定的容器化应用管理

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

STM32嵌入式编程学习到提高:【4】UART串口打印

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接: 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 [选项] 所有者[:组] 文件名详细用法&#xff1a; Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...or: chown [OPTION]... --reference…...

介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型

openai o1介绍 一、官方技术报告要点剖析实验1 benchmark分析实验2:和phd比赛技术细节&#xff1a;Chain of Thought的使用人类偏好评估Human preference evaluationsatety技术细节&#xff1a;隐藏思维链为监控模型提供了机会:)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&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...