由于要做个天气应用,需要找个天气的API。上网上搜了下都是那几个,而且基本都过时了。百度有个天气API,不过貌似只能提供当天的。网上提到的中国气象接口的文章,大都用的时旧API,有的被封了,有的永远停到了2014年3月24不更新了。
后来找到了中国天气的新接口,已经升级成气象数据开放平台了http://openweather.weather.com.cn/。没有开发者社区或论坛什么的,只能自己琢磨他的文档了(感觉没人维护。。)。
经过几个疑难点卡住后,总算调通了。现分享给大家。
1.申请keys
首先注册账号,然后填资料等审核(还要身份证。。。),话说审核真是慢,我等了一个星期才审核通过,之后就有了自己的Key了,这个请求天气数据时会用到。
2.申请服务
审核通过后,就可以去产品中心那申请接口了。目前有两种:常规气象数据接口与基础气象数据接口。区别在于常规的比基础的城市多。至于价钱么,不要300/年,不要30/年,现在大优惠只需0/年,常规气象数据接口带回家:P。
3.研读API文档
有JAVA的示例代码可以参考,主要包含key加密的内容,可以直接用,其他请求等需要自己写。
请求用get,解析用json,没什么难点,主要是加密这。。。
这个加密之前也没怎么太上心看,结果看晕了,卡了不少时间。
主要加密由public_key与private_key结合,作为key这个参数,一起传递过去。
传递URL格式如下:
http://open.weather.com.cn/data/?areaid="areaid"&type="type"&date="date"&appid="appid_six"&key="key"
参数介绍:
areaid:城市地区代码,官方有表格提供,可以考虑用101010100(北京)
type:请求数据的类型:指数:index_f(基础接口);index_v(常规接口); 3天预报:forecast_f(基础接口);forecast_v(常规接口);我用的forecast_v
date:当前时间 格式yyyyMMddHHmm 如201506051423
appid:这是个坑,这块正式请求时,用的是appid的前六位,我在这卡了很久。。。只有作为public_key时才用完整的appid,后边会说
key:到了这个复杂的东西了,这块用到三个东西来完成,首先:
private_key:申请到的那个key
public_key:格式如下,与传递的URL类似但不同,其一在于没有key参数,其二在于appid使用的是完整的appid。这很重要
http://open.weather.com.cn/data/?areaid="areaid"&type="type"&date="date"&appid="appid_full"
然后有个这两个之后,使用提供的java示例代码中的standardURLEncoder(public_key,private_key),将公钥和私钥结合为key参数
之后基本就可以收到返回的天气信息了。
4.解析天气信息
返回的json信息就不多说了,官方提供的文档有对应的解释,就是参数都是c1,c2...fa,fb,fc之类的,太不人性化了。
在这遇到的主要问题是,返回的汉子乱码。。。。
估计可能时由于和服务器端使用的编码不同,不是utf-8。。。。。
而且官方啥都没说。。。。。
没办法,我就只能苦逼的一个一个编码尝试,用了好多种方法解码总算是还原为汉字了,方法如下:
byte[] converttoBytes = weather.city.getBytes("ISO-8859-1"); String s1 = new String(converttoBytes); System.out.println(s1); weather.city = s1;
经过测试,传来的汉字格式居然是ISO-8859-1的?(此处如理解有错误,请指正)好吧,感觉很奇葩--!
到这大家基本就都能顺利调通了吧,相信小伙伴都没问题的
转载请注明出处哈http://blog.csdn.net/lqc1992/article/details/46375567