先说首先想到的,URL编码问题

某一天我在测试代码的时候突然发现,程序下载下来的xml文件倒确实是xml文件,但是里面只有一个根节点。

也就是说,联网正常,但是获取内容失败了。

因为API一共就三个属性,最后一个是日子,肯定没错,于是问题只可能出现在城市和密码上。

我首先怀疑密码失效了,因为我根本找不到这个API的申请入口,百度了一下有人说是内部API,所以密码是直接拿别人的来用的。

之前用Python写字典的时候碰到过这样的事,总之就是被ban掉了,我怀疑这次也是,于是回原网页重新打开原博主给的链接,结果发现完全没问题,可以访问。

然后我略一思考就发现了问题。

原博主的地址是这个样子的:

http://php.weather.sina.com.cn/xml.php?city=%D6%D8%C7%EC&password=DJOYnieT8234jlsK&day=0

我想了想,把city属性改成了汉字重庆,结果果然不行。

哦,编码问题。

又他娘的是编码问题,可是这种编码叫什么我不知道啊。

苦苦搜寻了半天找到了,叫URL编码。

同时还找到了另一个人提供的解决办法。

java.net.URLEncoder.encode(String s)
java.net.URLDecoder.decode(String s)

不过这两个方法已经弃用了,正确的用法是加上第二个字符串参数,自行制定编码类型。

于是我就试了一下,用GB2312来给"南昌"字符编码,变成了%C4%CF%B2%FD,于是就成功了。

URL编码的存在主要是考虑到有些人的设备只支持ASCII编码,所以就要想办法把其他字符用ASCII码来表示出来。

不过我的火狐在前两天更新之前是可以直接用汉字来访问API的,不知道新版本改了什么。

原文地址:https://www.cnblogs.com/chihane/p/3619058.html