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

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,适用于各种应用场景。

希望通过这篇文章,大家能学会如何封装第三方接口调用方法,并将其应用到实际项目中。


http://www.kler.cn/news/321676.html

相关文章:

  • Sqlserver事务行版本控制指南
  • 面向pymupdf4llm与MinerU 面试题
  • OpenHarmony(鸿蒙南向)——平台驱动指南【HDMI】
  • 倾斜单体化重建异形和异形建筑思路整理
  • 力扣583-两个字符串的删除操作(Java详细题解)
  • Spring Boot的核心技术有哪些?
  • AIGC引领数智未来:企业架构演进的深度解析与实践路径,The Open Group 2024生态系统架构·可持续发展年度大会专题报道
  • 深入理解 CompletableFuture 的底层原理
  • 使用npm link 把一个本地项目变成依赖,引入到另一个项目中
  • xlsx库插件读取excel文件
  • 在使用 Docker 时,用户可能会遇到各种常见的错误和问题
  • 使用python进行自然语言处理的示例
  • jmeter-请求参数加密-MD5加密
  • 美食共享圈:Spring Boot校园周边美食平台
  • uniapp踩坑 tabbar页面数据刷新了但视图没有更新
  • 【1分钟学会】JSON
  • Sentinel-1 数据处理时如何手动下载高程数据
  • 形象解释暂停方法和旁路方法
  • 力扣30. 串联所有单词的子串
  • Linux中的进程替换
  • linux:chown用法详解
  • 微调大模型(Finetuning Large Language Models)—Where finetuning fits in(二)
  • Oracle 相关的工具使用 SQL Developer , sqlplus
  • Kotlin:变量声明,null安全,条件语句,函数,类与对象
  • SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器
  • Brave编译指南2024 MacOS篇-获取源码(三)
  • 如何解决: Java商城系统开发过程中 开发难度大和时间紧的问题
  • python-rpc-windows服务器C#项目远程调用Linux服务器上的python脚本
  • 数据库常见概念
  • React学习笔记(2.0)