当前位置:首页 > 工具 > 正文内容

HTTP接口调用与JSON数据解析实战

访客 工具 2026年7月3日 4

在Java开发中,调用第三方接口并解析返回的JSON数据是常见需求。本文以国际新闻数据接口为例,详细讲解完整的实现流程。

准备工作

需要准备以下资源:

  • API接口服务:本文使用天聚数行平台提供的国际新闻接口
  • JSON解析工具:Gson库(Google JSON库)
  • 开发工具:Eclipse或IntelliJ IDEA

首先在项目中导入Gson依赖。以Maven项目为例,在pom.xml中添加:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

创建数据实体类

调用接口前,需要根据JSON数据结构创建对应的实体类。示例JSON数据结构如下:

{
    "code": 200,
    "msg": "success",
    "result": {
        "curpage": "1",
        "allnum": 100,
        "newslist": [
            {
                "id": "123",
                "ctime": "2024-01-15",
                "title": "新闻标题",
                "description": "新闻描述",
                "source": "来源",
                "picUrl": "图片地址",
                "url": "原文链接"
            }
        ]
    }
}

根据上述结构,创建对应的Java实体类:

public class NewsResponse {
    public int code;
    public String msg;
    public NewsData result;

    public static class NewsData {
        public String curpage;
        public String allnum;
        public ArrayList<NewsItem> newslist;
    }

    public static class NewsItem {
        public String id;
        public String ctime;
        public String title;
        public String description;
        public String source;
        public String picUrl;
        public String url;
    }
}

重要提示:实体类的成员变量名称必须与JSON字段名称完全一致,否则无法正确解析。

实现API调用与数据解析

完整实现代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;

public class NewsApiDemo {
    private static final String API_URL = "https://apis.tianapi.com/world/index";
    private static final String API_KEY = "YOUR_API_KEY";

    public static void main(String[] args) {
        String jsonResponse = fetchNewsData(3);
        if (jsonResponse != null) {
            parseAndPrintNews(jsonResponse);
        }
    }

    private static String fetchNewsData(int newsCount) {
        HttpURLConnection connection = null;
        try {
            URL url = new URL(API_URL);
            connection = (HttpURLConnection) url.openConnection();
            
            connection.setRequestMethod("POST");
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            String params = "key=" + API_KEY + "&num=" + newsCount;
            OutputStream os = connection.getOutputStream();
            os.write(params.getBytes());
            os.flush();
            os.close();

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                return readResponse(connection.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
        return null;
    }

    private static String readResponse(InputStream is) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        StringBuilder response = new StringBuilder();
        String line;
        
        while ((line = reader.readLine()) != null) {
            response.append(line);
        }
        reader.close();
        return response.toString();
    }

    private static void parseAndPrintNews(String jsonData) {
        Gson gson = new Gson();
        NewsResponse response = gson.fromJson(jsonData, NewsResponse.class);

        if (response.code == 200) {
            System.out.println("=== 响应信息 ===");
            System.out.println("状态码: " + response.code);
            System.out.println("消息: " + response.msg);
            System.out.println("当前页: " + response.result.curpage);
            System.out.println("总数: " + response.result.allnum);
            
            System.out.println("\n=== 新闻列表 ===");
            System.out.println("列表长度: " + response.result.newslist.size());
            
            for (NewsResponse.NewsItem item : response.result.newslist) {
                System.out.println("\n--- 新闻条目 ---");
                System.out.println("发布时间: " + item.ctime);
                System.out.println("标题: " + item.title);
                System.out.println("来源: " + item.source);
                System.out.println("描述: " + item.description);
            }
        } else {
            System.out.println("接口调用失败: " + response.msg);
        }
    }
}

代码关键点说明

1. HTTP连接配置

  • 设置请求方法为POST
  • 配置连接超时和读取超时时间
  • 设置Content-Type为application/x-www-form-urlencoded

2. 参数传递

通过OutputStream将请求参数写入请求体,参数格式为key=value对,多个参数用&连接。

3. 响应读取

使用BufferedReader按行读取响应内容,追加到StringBuilder中,最后转换为字符串。

4. JSON解析

通过Gson的fromJson方法,将JSON字符串自动映射到Java对象。Gson会根据字段名称进行匹配。

运行结果

执行程序后,控制台输出类似以下内容:

=== 响应信息 ===
状态码: 200
消息: success
当前页: 1
总数: 100

=== 新闻列表 ===
列表长度: 3

--- 新闻条目 ---
发布时间: 2024-01-15
标题: XXX新闻标题
来源: XXX来源
描述: XXX新闻描述

--- 新闻条目 ---
发布时间: 2024-01-14
标题: XXX新闻标题2
来源: XXX来源2
描述: XXX新闻描述2

...

通过这种方式,可以灵活调用各类API接口,并使用Gson快速解析JSON数据。

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。