Java开发实战:使用Hutool与JWT快速接入和风天气API
引言
在应用开发中,获取实时天气数据是许多应用场景中的关键需求,如农业、出行规划、智能家居等。为了帮助开发者高效地集成高质量的天气数据,和风天气提供了丰富的接口,包括实时天气、未来天气预报、天气预警等 本文将手把手教你如何使用 **Java 技术栈 **快速接入和风天气 API,并通过 Hutool 工具库 简化网络请求和 Gzip 数据解压操作。 和风天气接口API:开发文档 | 和风天气开发服务
主要步骤概述
我将本文介绍的步骤总结为一下几步:
注册账号、创建项目并生成凭据;使用 OpenSSL 生成 Ed25519 密钥对,完成 JWT 认证;Java 代码生成 JWT Token;使用 Hutool 发起 HTTP 请求,自动解压 Gzip 压缩的 JSON 数据;解析返回结果,获取天气预报信息;
开始使用
下面我将介绍一下如何从零开始使用和风天气
和风天气开发指南:开始使用 | 和风天气开发服务
步骤拆解
我将直接安装官网的步骤一步步列出,稍微具体的内容大家可以点击超链接查看
注册自己的账号,通过邮箱注册,登录官网自行注册
创建项目和凭据用来管理你的API。
了解身份认证,和风天气支持两种身份认证方式:JSON Web Token (JWT) 以及 API KEY。
获取API Host,这是你独立的API请求地址。
如何发送API请求。
创建项目与凭据
然后输入项目名称即可生成项目
注意:JWT的公钥上传时,要将生成的内容全部传上去,也就是它展示的那种格式
如何进行身份认证
我们重点讲解JWT认证,因为API KEY2027年很可受到限制,且起使用也比较简单,这里不做讲述。
如何创建一个自己的token,官方文档如下:身份认证 | 和风天气开发服务 下面我将讲解一个流程,即java8+的版本:
1,生成Ed25519密钥
我们将介绍官网使用OpenSSL创建Ed25519密钥的方法。
首先安装OpenSSL,官网地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
我们往下滑找到我们下载的版本:
默认版本适合我们开发人员使用;light版本适合用户使用;arm版本适合ARM 处理器上使用。 我们这里用win64即可,即图上标注的。
安装教程
同意协议
安装路径,建议纯英文
默认第一个,之后Install即可!
最后有个打赏的我们去掉然后点finish即可!
然后将其配置到环境变量中,这样我们可以在任意目录下使用它,和jdk类似,复制到其bin目录即可
输入命令
选择一个合适的目录( 因为文件会直接生成在当前目录下),输入cmd打开终端,粘贴下列文本生成公钥和私钥:
openssl genpkey -algorithm ED25519 -out ed25519-private.pem \
&& openssl pkey -pubout -in ed25519-private.pem > ed25519-public.pem
当前目录创建的两个文件:
ed25519-private.pem,私钥,用于JWT认证的签名。你应该妥善安全的保管私钥。ed25519-public.pem,公钥,用于签名的验证,需要上传到和风天气控制台
然后将公钥上传即可,记得上传完整的,不要只复制中间的部分
生成JWT
这里我们直接上代码解释如何生成,版本是java8+的版本
所需要的依赖库的maven坐标:
Java代码:
大家将汉字标注的地方替换为自己的即可测试,后续可以将控制台打印出的token去官网进行校验,通过则代表生成成功
public static String createJwt() throws Exception {
// Private key
String privateKeyString = "自己的私钥,后续可以通过文件读取,或写入到配置文件中";
privateKeyString = privateKeyString.trim().replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").trim();
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);
PKCS8EncodedKeySpec encoded = new PKCS8EncodedKeySpec(privateKeyBytes);
PrivateKey privateKey = new EdDSAPrivateKey(encoded);
// Header
String headerJson = "{\"alg\": \"EdDSA\", \"kid\": \"之前图上标注的kid\"}";
// Payload
long iat = ZonedDateTime.now(ZoneOffset.UTC).toEpochSecond() - 30;
long exp = iat + 900;
String payloadJson = "{\"sub\": \"之前图上标注的sub\", \"iat\": " + iat + ", \"exp\": " + exp + "}";
// Base64url header+payload
String headerEncoded = Base64.getUrlEncoder().encodeToString(headerJson.getBytes(StandardCharsets.UTF_8));
String payloadEncoded = Base64.getUrlEncoder().encodeToString(payloadJson.getBytes(StandardCharsets.UTF_8));
String data = headerEncoded + "." + payloadEncoded;
EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519);
// Sign
final Signature s = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm()));
s.initSign(privateKey);
s.update(data.getBytes(StandardCharsets.UTF_8));
byte[] signature = s.sign();
String signatureString = Base64.getUrlEncoder().encodeToString(signature);
// System.out.println("Signature: \n" + signatureString);
// Token
String jwt = data + "." + signatureString;
System.out.println("JWT: \n" + jwt);
return jwt;
}
注意:一定要注意私钥的正确性与完整性,这段官方代码是没有问题的,我已经验证过了,如果出现问题很大概率是你的私钥传入有误,请一定传入完整且正确的私钥!
发送请求与解析数据
我们借用hutool工具包来发送与接受数据,因为和风天气返回数据是JSON格式并进行了Gzip压缩的,而hutool可以帮我们自动解压缩,非常方便!
maven坐标:
优先说明:API_HOST在控制台,设置中可以查看,url则以30天的天气为例,本方法直接将结果中的天气信息daily返回了
搭配上之前的构造jwt的方法,再出入你想查看的地理位置,即可调用该接口。
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson2.JSON;
import java.util.HashMap;
import java.util.Map;
public class WeatherApiClient {
// 接口地址
private static final String API_HOST = "自己的API_HOST";
private static final String BASE_URL = "https://" + API_HOST + "/v7/weather/30d";
/**
* 获取 30 天天气预报
*
* @param location 地理位置(LocationID 或 经纬度)
* @return JSON 响应字符串
*/
public static String getWeather30Days(String location, String jwt) {
// 构建查询参数
Map
params.put("location", location);
params.put("unit", "m"); // 公制单位,可选
params.put("lang", "zh"); // 多语言,可选
// 发送 GET 请求
HttpResponse response = HttpRequest.get(BASE_URL)
.form(params)
.header("Authorization", "Bearer " + jwt)
.timeout(10000) // 超时设置
.execute();
// 检查响应状态码
if (response.isOk()) {
// 处理响应数据,hutool帮我们解压缩了
String body = response.body();
//System.out.println(JSON.parseObject(body).getString("fxLink"));
return JSON.parseObject(body).getString("daily");
} else {
throw new RuntimeException("请求失败,HTTP 状态码:" + response.getStatus());
}
}
}
总结
本文只是拿一个30天的天气预报举例,其他的调用与此类似,大家可自行阅读开发文档 | 和风天气开发服务 进行调用!
我这里再总结一下步骤,帮大家回顾:
注册账号、创建项目并生成凭据;使用 OpenSSL 生成 Ed25519 密钥对,完成 JWT 认证;Java 代码生成 JWT Token;使用 Hutool 发起 HTTP 请求,自动解压 Gzip 压缩的 JSON 数据; 似,大家可自行阅读开发文档 | 和风天气开发服务 进行调用!