中国天气网 API
来源:互联网 发布:网络需求分析报告 编辑:程序博客网 时间:2024/06/10 14:05
中国天气网 API
《真正的中国天气api接口xml, json》详解
前言
某天想写个天气软件,于是上网找找有没有免费的天气 API 。发现许多的API不是收费,就是不能用了(心塞塞)。最后找到这篇文章
真正的中国天气api接口xml,json(求加精) …
心里那个高兴啊,终于找到一个能用的天气 API 了。
用浏览器试了一下,确实不错,作者晒出的API都是能用的。于是便写代码捣鼓解析 API 返回的 xml
问题
代码如下
public class WeatherApiDataGetter { public static void main(String[] args) { // xmlContent 用来存储 API 返回的 xml 中的所有内容 StringBuilder xmlContent = new StringBuilder(); try { // 将 API 地址包装成 URL // 101010100 是北京的城市代码 URL weatherUrl = new URL("http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100"); // 获取 URL 连接 URLConnection urlConnection = weatherUrl.openConnection(); // 获取 URL 连接的输入流对象,以 UTF-8 的编码格式打开流, // 并包装成 BufferedReader 对象以提高读取速率 BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(), "UTF-8") ); // 读取流中的所有内容 String line; while ((line = bufferedReader.readLine()) != null) { xmlContent.append(line); } } catch (IOException e) { e.printStackTrace(); } // 输出 xml 中的所有内容 System.out.println(xmlContent); }}
结果
没错,乱码
好吧,我们换一种编码试试,换成 GBK 编码
// 获取 URL 连接的输入流对象,以 GBK 的编码格式打开流,// 并包装成 BufferedReader 对象以提高读取速率BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(), "GBK"));
结果
还是不行诶
好吧,我们再试一种编码吧,这次是 Unicode 编码
// 获取 URL 连接的输入流对象,以 Unicode 的编码格式打开流,// 并包装成 BufferedReader 对象以提高读取速率BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(urlConnection.getInputStream(), "Unicode"));
结果
纠结……
为什么浏览器可以,我直接读取又不可以?一定是我的大家方式不对
探索
既然浏览器可以查看 API 返回的 xml ,那肯定用了什么特殊的方法
我们来尝试着研究一下
首先,从浏览器打开 API 网址
http://wthrcdn.etouch.cn/WeatherApi?citykey=101010100
其次,我们打开浏览器后按 F12
打开浏览器的开发者工具(我这里用的是360极速浏览器,可能其他的浏览器快捷键不一样)。
再次,点击 Netword
选项。这个选项可以记录浏览器在打开网页时的所有的行为。
然后,我们刷新一下网址,这样就能把浏览器的行为记录下来了
结果
很好,浏览器做的事很简单,先选择第一个。看名字就知道,这个是我们刚刚打开的网址。
选择右边的 Headers
,我们一行一行地研究,于是发现这行
Content-Encoding:gzip
原来 API 返回的是 gzip 格式的文件,这样就终于知道自己获取的流为什么乱码了。
了解更多关于浏览器 F12
的 Netword
选项
- 模拟浏览器登陆 - 百度搜索
关于 gzip 格式的简单介绍
- gzip 小结
解决
我们重新改改代码,把流对象用 GZIPInputStream 包装一下
// 获取 URL 连接的输入流对象,然后包装成 GZIPInputStream 对象,// 再包装成 BufferedReader 对象以提高读取速率BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( new GZIPInputStream(urlConnection.getInputStream())/*, "UTF-8"*/ // 实测可以不指定编码方式 ));
结果
嗯,这下总算是正确了
后记
剩下的就是解析了 xml 了。
另外,城市代码可以参考如下网址
- 城市ID列表
实测部分城市不可用。具体可以自己一个一个去试,当然也可以下载下面的示例
下载包含以下内容的示例
- 通过城市代码获取 xml 文本
- 解析 xml 内容
- 所有可用城市列表
- 中国天气网API
- 中国天气网API
- 中国天气网API
- 中国天气网API
- 中国天气网API
- 中国天气网 API
- 中国天气网免费天气API
- 关于中国天气网API
- 中国天气网API(2014.11)
- 中国天气网api接口
- 中国天气网API接口
- 中国天气网天气API参数详细解释说明
- 【汇总】中国天气网提供的天气开发api接口
- android中国天气网api获取天气信息并解析
- java 调用中国天气网API
- 中国天气网api(json格式)
- 中国天气网免费天气预报接口API
- PHP 天气预报API 中国天气网
- 自学iOS开发系列----UI(视图编程入门:UINavigationController)
- struts2基础——需要注意的几点
- 各大OJ题目分类
- 视频播放插件AvPro QuickTime
- JavaScript中的跑马灯
- 中国天气网 API
- 动态多态
- 百度编辑器(UEditor)自定义工具栏
- 《李光耀观天下(One man's view of the world)》文摘
- Java---IO流之序列流(文件合并)
- docker state.json
- android核心技术之ANR分析(MTK)
- numpy以及matpoltlib备忘录
- 10分钟精通SharePoint-App