HTTP接口调用与JSON数据解析实战
在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数据。
