介绍
和风天气是一个提供全球天气预报和气象数据的服务平台,支持多种语言,提供实时天气、未来天气预报、空气质量指数、生活建议等多种气象数据,可以广泛用于网页开发、移动应用和物联网设备等场景。
开发文档:文档 | 和风天气开发服务
快速开始
首先注册账号,然后在控制台中创建项目,可以选择免费订阅或按量计费两种订阅模式,然后可以为项目设置第一个KEY,KEY是获取和风天气开发服务的密钥,可以在Web、iOS、Android三种平台中进行选择:
创建完成之后,在项目管理中可以查看或创建Key:
在浏览器中输入下列API地址(将KEY替换成自己创建的KEY)就可以获得北京市的实时天气数据。(此处使用的免费订阅)
https://devapi.qweather.com/v7/weather/now?location=101010100&key=你的KEY
查询得到数据如下:
简单使用
以开发文档中的城市搜索功能为例。
后端用其它方式得到目标位置的经纬度后,向API发送 Get 请求:
//注意:请求参数包括必选和可选参数,如不填写可选参数将使用其默认值,参数之间使用&进行分隔。
//具体参数要求查阅开发文档。
//城市搜索请求URL:https://geoapi.qweather.com/v2/city/lookup?{查询参数}
JSONObject geo = this.decompressStringTOJson(restTemplate.getForObject(
"https://geoapi.qweather.com/v2/city/lookup?" +"location=" + longitude
+ "," + latitude +"&key=yourKEY", byte[].class));
接收并解压数据后将得到的JSON数据存入 vo 对象,然后返回给前端:
@GetMapping("/weather")
//接收前端传递的经纬度数据
public RestBean<WeatherVO> weather(double longitude, double latitude) {
//使用业务层中封装好的方法,请求并解压数据,最后存入vo对象
WeatherVO vo = weatherService.fetchWeather(longitude, latitude);
//成功则将vo对象返回给前端
return RestBean.success(vo);
}
前端接收到数据后直接使用即可:
最后效果如下:
图标使用
和风天气图标 (qweather.com)
使用 npm 快速在项目中安装图标:
npm i qweather-icons
使用之前还需要引入CSS样式表:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/qweather-icons@1.6.0/font/qweather-icons.css">
在图标库中找到想要的图标,直接复制使用即可,例:
<i class="qi-100"></i>
Gzip压缩
和风天气的Web API默认采用Gzip进行压缩,因此在后端需要专门进行解压以处理数据。
首先在配置文件中配置 RestTemplate ,用于获取响应数据:
@Configuration
public class WebConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
在业务层中创建方法,该方法可以将 Gzip 压缩之后的字节数组解压并解析为 JSON 对象:
private JSONObject decompressStringTOJson(byte[] data) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
try {
//GZIP输入流,用于解压
GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(data));
byte[] buffer = new byte[1024];
int read;
//读取数据写入输出流
while ((read = gzip.read(buffer)) != -1) {
stream.write(buffer, 0, read);
}
gzip.close();
stream.close();
// 将解压后的数据转换为JSONObject并返回
return JSONObject.parseObject(stream.toString());
} catch (IOException e) {
return null;
}
}
该方法在开发中的具体使用:
//先依赖注入RestTemplate
@Resource
RestTemplate restTemplate;
//调用该方法,并使用RestTemplate中的getForObject方法向和风天气API发送GET请求,并告知返回值为GZIP压缩后的byte数组。
//用JSONObject接收解压后的数据
JSONObject now = this.decompressStringTOJson(restTemplate.getForObject(
"https://devapi.qweather.com/v7/weather/now?location=" + id
+ "&key=yourKEY", byte[].class));
最后就能得到解压后的JSON数据。