两种方法轻松简单解决和风天气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(和风天气)

使用python调用和风天气API查询当前天气信息

微信小程序入门:和风天气小程序

基于Arduino和ESP8266的JSON数据获取与解压之和风天气

Android中 GsonFormat插件解析Jason 数据+和风天气接口解析案例

微信小程序+和风天气完成天气预报