场景
公司需要采集天气的温度,湿度作为数据来源,位置精确到区县,比如上海市浦东新区。网上搜了几种对接天气的接口,有的API只支持到城市,这种个接口可支持到区县。
第三方API
http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=&appsecret=
文档说明实况天气接口API开发指南 未来一天天气预报api - 天气API
代码
import com.alibaba.fastjson.JSONObject;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
/**
* 调用天气接口,接口文档:http://www.tianqiapi.com/index/doc?version=v61
* 使用第三方天气接口,实现天气情况查询功能
* @author yaomenghua
* @create 2024/4/26 10:29
*/
@Component
public class SimpleWeatherAPI {
/**
* ('101020100', 'shanghai', '上海', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.231706', '121.472644'),
* ('101020200', 'minhang', '闵行', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.111658', '121.375972'),
* ('101020300', 'baoshan', '宝山', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.398896', '121.489934'),
* ('101020400', 'huangpu', '黄浦', 'shanghai', '上海', 'China', '中国', 'huangpu', '黄浦', '31.222771', '121.490317'),
* ('101020500', 'jiading', '嘉定', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.383524', '121.250333'),
* ('101020600', 'pudongxinqu', '浦东新区', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.245944', '121.567706'),
* ('101020700', 'jinshan', '金山', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '30.724697', '121.330736'),
* ('101020800', 'qingpu', '青浦', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.151209', '121.113021'),
* ('101020900', 'songjiang', '松江', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.03047', '121.223543'),
* ('101021000', 'fengxian', '奉贤', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '30.912345', '121.458472'),
* ('101021100', 'chongming', '崇明', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.626946', '121.397516'),
* ('101021200', 'xuhui', '徐汇', 'shanghai', '上海', 'China', '中国', 'shanghai', '上海', '31.179973', '121.43752'),
* ('101021300', 'changning', '长宁', 'shanghai', '上海', 'China', '中国', 'changning', '长宁', '31.218123', '121.4222'),
* ('101021400', 'jingan', '静安', 'shanghai', '上海', 'China', '中国', 'jingan', '静安', '31.229003', '121.448224'),
* ('101021500', 'putuo', '普陀', 'shanghai', '上海', 'China', '中国', 'putuo', '普陀', '31.241701', '121.392499'),
* ('101021600', 'hongkou', '虹口', 'shanghai', '上海', 'China', '中国', 'hongkou', '虹口', '31.26097', '121.491832'),
* ('101021700', 'yangpu', '杨浦', 'shanghai', '上海', 'China', '中国', 'yangpu', '杨浦', '31.270755', '121.522797'),
*/
/**
* 天气情况查询接口地址
* unescape=1&version=v61&appid=&appsecret=
* unescape=1,如果您希望json不被unicode, 直接输出中文, 请传此参数: 1
* version=v61,接口版本号,默认v61
* appid=,您申请的appid,您可以在管理控制台首页中看到
* appsecret=,您申请的appsecret,您可以在管理控制台首页中看到
*
*/
public static String API_URL = "http://v1.yiketianqi.com/api?unescape=1&version=v61&appid=XXXXXXX&appsecret=XXXXX";
/**
* 根据城市名查询天气情况
*
* @param cityid
*/
public WeatherVO queryWeather(String cityid) {
WeatherVO weatherVO = new WeatherVO();
try {
String apiUrl = new StringBuffer(API_URL).append("&cityid=").append(cityid).toString();
uploadDataLogUtils.saveLog(100, "测试第三方天气:请求url", 0, apiUrl);
String response = doGet(apiUrl);
JSONObject jsonObject = JSONObject.parseObject(response);
System.out.println("温度:"+ jsonObject.getString("tem"));
System.out.println("湿度: "+ jsonObject.getString("humidity"));
} catch (Exception e) {
e.printStackTrace();
}
return weatherVO;
}
/**
* get方式的http请求
*
* @param httpUrl 请求地址
* @return 返回结果
*/
public String doGet(String httpUrl) {
HttpURLConnection connection = null;
InputStream inputStream = null;
BufferedReader bufferedReader = null;
String result = null;
try {
// 创建远程url连接对象
URL url = new URL(httpUrl);
// 通过远程url连接对象打开一个连接,强转成httpURLConnection类
connection = (HttpURLConnection) url.openConnection();
// 设置连接方式:get
connection.setRequestMethod("GET");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(5000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(6000);
// 发送请求
connection.connect();
// 通过connection连接,获取输入流
if (connection.getResponseCode() == 200) {
inputStream = connection.getInputStream();
// 封装输入流,并指定字符集
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
// 存放数据
StringBuilder sbf = new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null) {
sbf.append(temp);
sbf.append(System.getProperty("line.separator"));
}
result = sbf.toString();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (null != bufferedReader) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != inputStream) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();// 关闭远程连接
}
}
return result;
}
}