老人说,今天他来晚了,钓的是一篓暮色。明天他要起早,一定能钓到一江朝阳。——《暮色的快乐》
前言
为什么用浏览器测试,数据返回都很正常,但是用代码获取就会变成乱码呢?
浏览器获取数据截图:
代码运行截图:
嗯哼,其实遇到这个问题,最主要不是我们代码的问题,而是阅读开发文档不够仔细, 拿到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();
}
非常感谢你能看到这里,如果能够帮助到你是我的荣幸!