对接第三方实时天气API

 场景

公司需要采集天气的温度,湿度作为数据来源,位置精确到区县,比如上海市浦东新区。网上搜了几种对接天气的接口,有的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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值