两种方法轻松简单解决和风天气Web API返回数据乱码问题
Posted Steven Jon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两种方法轻松简单解决和风天气Web API返回数据乱码问题相关的知识,希望对你有一定的参考价值。
老人说,今天他来晚了,钓的是一篓暮色。明天他要起早,一定能钓到一江朝阳。——《暮色的快乐》
前言
为什么用浏览器测试,数据返回都很正常,但是用代码获取就会变成乱码呢?
浏览器获取数据截图:
代码运行截图:
嗯哼,其实遇到这个问题,最主要不是我们代码的问题,而是阅读开发文档不够仔细, 拿到api就撸起袖子,双手哒哒哒的开始写代码了,仔细阅读下文档再动手撸代码也不迟。
看文档,注意请求参数:
上面请求参数有个gzip
请求参数,如果注意到它了,这个乱码问题就迎刃而解了。
一、不开启gzip方式压缩
只需要在原来的url上增加多一个gzip
参数,gzip=n
:
String url = "https://devapi.qweather.com/v7/air/now?location=XXX&key=XXX&gzip=n"
此时再运行代码,就不存在乱码了:
二、使用GZIPInputStream
如果API启用了gzip,毕竟对API接口进行压缩,可以极大的减少API接口访问延迟,减少缓存空间,提高接口连接成功率。那改如何解决呢?
不用担心,在java.util.zip
下有个GZIPInputStream
类专门处理这件事的,只需要在原来的代码中修改一行代码:
InputStream is = new GZIPInputStream(conn.getInputStream());
再运行代码,也不存在乱码了:
最后贴上全部代码,如果还存在乱码问题,可以参考下面的代码:
public static String doGet(String qUrl)
StringBuilder sb = new StringBuilder();
InputStream is = null;
BufferedReader br = null;
try
URL url = new URL(qUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(1000);
conn.setConnectTimeout(1000);
conn.setRequestProperty("accept" , "*/*");
conn.setRequestProperty("contentType", "application/json;charset=utf-8");
is = new GZIPInputStream(conn.getInputStream());
br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String line;
while((line = br.readLine()) != null)
sb.append(line);
catch (IOException e)
e.printStackTrace();
finally
try
if(br != null)
br.close();
if(is != null)
is.close();
catch (IOException e)
e.printStackTrace();
return sb.toString();
非常感谢你能看到这里,如果能够帮助到你是我的荣幸!
以上是关于两种方法轻松简单解决和风天气Web API返回数据乱码问题的主要内容,如果未能解决你的问题,请参考以下文章
jQuery的文档操作(重点)/简单接触ajax(和风天气)
基于Arduino和ESP8266的JSON数据获取与解压之和风天气