Java调用HTTP接口的几种实现方式与工具类构建

陆遥
陆遥
发布时间:2026-10-16| 4人浏览过
原创

在Java后端开发中,调用外部HTTP接口是常见需求。本文将介绍从原生连接方式到Spring框架封装的几种常用方法,包括使用URL对象流读取、通过RestTemplate处理不同HTTP方法(如POST、PATCH)以及利用工具类解析JSON响应数据的完整流程。

基础方法:使用 URL 对象获取返回数据

在处理简单的HTTP请求时,可以直接使用Java标准库中的java.net.URL和URLConnection。首先,我们需要确定目标接口的地址,并确保该接口正常返回JSON格式数据。

在浏览器中访问该接口地址,可以看到预期的JSON输出内容,这验证了接口的可用性:

第1步:通过 HttpURLConnection 获取返回值

目的:使用底层API建立连接并读取响应流。 入口:java.net.URL 与 java.net.HttpURLConnection。 动作:打开连接后,使用BufferedReader包装输入流,逐行读取或拼接字符串。

代码逻辑涉及初始化HttpURLConnection实例,设置超时时间,获取输入流,并最终关闭资源。控制台将打印出接口返回的原始字符串。

运行该方法,控制台输出与浏览器一致的结果,说明数据成功获取:

第2步:通过 URL.openStream() 简化操作

目的:简化流的获取过程,减少样板代码。 入口:java.net.URL 对象的 openStream() 方法。 动作:直接调用openStream()获取InputStream,同样配合BufferedReader进行读取。

这种方式比显式创建HttpURLConnection更为简洁,适用于无需复杂配置Header的场景。

获取数据后,通常会将其赋值给变量,并利用JSON库(如JSONObject)进行解析,以便提取特定字段进行后续业务处理:

进阶方案:基于 RestTemplate 的工具类封装

在实际企业级开发中,通常推荐使用Spring提供的RestTemplate进行HTTP调用,它支持更丰富的HTTP方法映射和自动序列化/反序列化。在使用前,需引入相关依赖。若项目中未使用Spring Boot starter,可能需要单独配置RestTemplate Bean,但此处展示直接在静态方法中初始化的示例。

一、 引入必要依赖

如果需要解析JSON数据,除了基础HTTP客户端外,还需引入JSON处理库。以下示例使用了json-lib进行传统格式的解析:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.3</version>
</dependency>
<!-- JSON转换包 -->
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

二、 HTTP 请求工具类实现

1. 通用 POST 请求方法

RestTemplate提供了exchange方法,允许我们自定义HttpMethod、请求头HttpHeaders和请求体HttpEntity。以下代码展示了如何发送POST请求:

public class HttpClient {
    /**
     * 向目的URL发送post请求
     *
     * @param url          目的url
     * @param headerParams 请求头参数 key:value
     * @param bodyParams   请求体参数  key:value
     * @return 
     */
    public static String sendPostRequest(String url, Map<String, String> headerParams,
                                         Map<String, String> bodyParams) {
        RestTemplate client = new RestTemplate();
        //新建Http头,add方法可以添加参数
        HttpHeaders headers = new HttpHeaders();
        //给请求头设置参数
        for (String key : headerParams.keySet()) {
            headers.add(key, headerParams.get(key));
        }
        //设置请求发送方式HttpMethod.GET、HttpMethod.DELETE等
        HttpMethod method = HttpMethod.POST;
        // 设置提交方式这里设置成application/json格式
        headers.setContentType(MediaType.APPLICATION_JSON);
        //将请求头部和参数合成一个请求
        HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(bodyParams, headers);
        //执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
        ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
        //返回类型也可以自动填充到实体类当中去,比如我自己创建了User类,当然字段名称要和返回字段一致
        //ResponseEntity<User> response = client.exchange(url, method, requestEntity, User.class);
        return response.getBody();
    }

2. 特殊方法 PATCH 的支持

由于RestTemplate内部使用的连接机制默认可能不包含所有HTTP动词(如PATCH),在某些环境下可能需要通过反射扩展支持的HTTP方法集合。

/**
     * 向目的URL发送patch请求,只比其他方式多了一个允许aptch方式的方法。
     * 由于httpclient不支持patch请求,所以需要反射方式获取连接对象,增加patch方式
     * @param url          目的url
     * @param headerParams 请求头参数
     * @param bodyParams   请求体参数
     * @return AdToutiaoJsonTokenData
     */
    public static String sendPatchRequest(String url, Map<String, String> headerParams,
                                          Map<String, String> bodyParams) {
        //httpclient不支持patch请求,反射方式获取连接对象,增加patch方式
        allowMethods("PATCH");
        RestTemplate client = new RestTemplate();
        //新建Http头,add方法可以添加参数
        HttpHeaders headers = new HttpHeaders();
        //给请求头设置参数
        for (String key : headerParams.keySet()) {
            headers.add(key, headerParams.get(key));
        }
        //headers.add("X-HTTP-Method-Override", "PATCH");
        //设置请求发送方式
        HttpMethod method = HttpMethod.PATCH;
        // 设置提交方式这里设置成application/json格式
        headers.setContentType(MediaType.APPLICATION_JSON);
        //将请求头部和参数合成一个请求
        HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(bodyParams, headers);
        //执行HTTP请求,将返回的结构使用String 类格式化(可设置为对应返回值格式的类)
        ResponseEntity<String> response = client.exchange(url, method, requestEntity, String.class);
        return response.getBody();
    }
    //增加支持patch请求方式
    private static void allowMethods(String... methods) {
        try {
         //获取连接类的属性,给属性添加aptch就允许aptch请求方式了 
            Field methodsField = HttpURLConnection.class.getDeclaredField("methods");
            Field modifiersField = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(methodsField, methodsField.getModifiers() & ~Modifier.FINAL);
            methodsField.setAccessible(true);
            String[] oldMethods = (String[]) methodsField.get(null);
            Set<String> methodsSet = new LinkedHashSet<>(Arrays.asList(oldMethods));
            methodsSet.addAll(Arrays.asList(methods));
            String[] newMethods = methodsSet.toArray(new String[0]);
            methodsField.set(null/*static field*/, newMethods);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new IllegalStateException(e);
        }
    }

三、 数据解析与应用

获取到响应字符串后,可以使用JSONObject对其结构进行拆解。以下示例展示了如何从Zoom API类似的响应中提取会议ID、开始链接及参与用户信息:

//工具类调用api接口,获取返回数据
 String result = HttpClient.sendPostRequest(createZoomMeetingUrl,header,body);
        JSONObject json = JSONObject.fromObject(result);
        //解析获取数据
        String startUrl = json.getString("start_url");
        String joinUrl = json.getString("join_url");
        //会议室id
        int id = json.getInt("id");
        //解析数据数据
        JSONArray jsonArray = json.getJSONArray("users");
        for(int i=0;i<jsonArray .size();i++){
          String firstName = jsonArray.getJSONObject(i).getString("first_name");
          ...............
        }

通过上述步骤,我们可以灵活地在Java后台实现对第三方API的稳定调用与数据解析。

以上就是Java实现调用对方HTTP接口得到返回数据的详细内容,更多关于Java后端HTTP客户端集成的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。