Android 天气APP(三)访问天气API与数据请求

简介: Android 天气APP(三)访问天气API与数据请求

访问天气API与数据请求

2. 访问天气API接口

3. 网络请求

① OKHttp

1.Post和Get的区别

2.同步和异步的区别

3.Get的同步请求

4.Get的异步请求

5.Post的同步请求

5.Post的异步请求


2. 访问天气API接口

这里用的是和风天气API接口,点击进入官网


20200401151439451.png

点击天气API进行登录控制台或者注册账号


20200401151558504.png


注册用邮箱就可以了,这里没有什么好讲解的,我是已经注册过了,所以我登录就可以了,然后进入控制台,创建应用。


20200401151745643.png


本来我想输入GoodWeather,但是最多输入11个字符,所以我就去掉了Good


20200401151910880.png


这里注意,一个邮箱只能创建一个免费应用。


20200401152354558.png


免费版有很多限制的,有钱的大佬可以升级成付费版,像我这种穷人就只能白嫖,好了,然后添加KEY,没有KEY的话应用访问不了。


2020040115445496.png


点击创建


20201217221055763.png


接下来我们看一下开发文档怎么去获取天气数据


20200401152840166.png


点击常规天气数据,免费版


20200401153119437.png


now就是今天的天气,根据这个文档我们来写一个访问地址


https://free-api.heweather.net/s6/weather/now?key=3086e91d66c04ce588a7f538f917c7f4&location=深圳


请注意,这个key=后面的这一串是你的应用的KEY,每个都不一样。

随便打开一个网页,地址栏粘贴进去,回车即可得到数据,


{"HeWeather6":[{"basic":{"cid":"CN101280601","location":"深圳","parent_city":"深圳","admin_area":"广东","cnty":"中国","lat":"22.54700089","lon":"114.08594513","tz":"+8.00"},"update":{"loc":"2020-04-01 15:45","utc":"2020-04-01 07:45"},"status":"ok","now":{"cloud":"100","cond_code":"104","cond_txt":"阴","fl":"18","hum":"82","pcpn":"0.0","pres":"1006","tmp":"18","vis":"16","wind_deg":"79","wind_dir":"东北风","wind_sc":"2","wind_spd":"9"}}]}

这是返回的数据,JSON数据,而我要把他转化成实体Bean来接收。这个时候就可以用到另一个Android Studio的插件了,GsonFormat


快速将JSON字符串转换成一个Java Bean,免去我们根据JSON字符串手写对应java Bean的过程。

20200324193854410.png


当然安装完之后是要重启Android Studio才能生效的,重启完毕之后来使用找个插件,


20200401155554176.png


然后复制刚才的返回值,


20200401155729134.png


鼠标点击光标处,Alt + S 弹出一个窗口


20200401155840154.png


框内粘贴返回值,点击OK


20200401155922258.png


这个页面可以修改参数的属性值和属性名,如果没有要修改就OK,然后实体Bean就生成了。


20200401160047459.png


严谨一点,我把这个实体Bean的代码粘贴一下


package com.llw.goodweather.bean;
import java.util.List;
public class TodayResponse {
    //生成实体Bean
    private List<HeWeather6Bean> HeWeather6;
    public List<HeWeather6Bean> getHeWeather6() {
        return HeWeather6;
    }
    public void setHeWeather6(List<HeWeather6Bean> HeWeather6) {
        this.HeWeather6 = HeWeather6;
    }
    public static class HeWeather6Bean {
        /**
         * basic : {"cid":"CN101280601","location":"深圳","parent_city":"深圳","admin_area":"广东","cnty":"中国","lat":"22.54700089","lon":"114.08594513","tz":"+8.00"}
         * update : {"loc":"2020-04-01 15:45","utc":"2020-04-01 07:45"}
         * status : ok
         * now : {"cloud":"100","cond_code":"104","cond_txt":"阴","fl":"18","hum":"82","pcpn":"0.0","pres":"1006","tmp":"18","vis":"16","wind_deg":"79","wind_dir":"东北风","wind_sc":"2","wind_spd":"9"}
         */
        private BasicBean basic;
        private UpdateBean update;
        private String status;
        private NowBean now;
        public BasicBean getBasic() {
            return basic;
        }
        public void setBasic(BasicBean basic) {
            this.basic = basic;
        }
        public UpdateBean getUpdate() {
            return update;
        }
        public void setUpdate(UpdateBean update) {
            this.update = update;
        }
        public String getStatus() {
            return status;
        }
        public void setStatus(String status) {
            this.status = status;
        }
        public NowBean getNow() {
            return now;
        }
        public void setNow(NowBean now) {
            this.now = now;
        }
        public static class BasicBean {
            /**
             * cid : CN101280601
             * location : 深圳
             * parent_city : 深圳
             * admin_area : 广东
             * cnty : 中国
             * lat : 22.54700089
             * lon : 114.08594513
             * tz : +8.00
             */
            private String cid;
            private String location;
            private String parent_city;
            private String admin_area;
            private String cnty;
            private String lat;
            private String lon;
            private String tz;
            public String getCid() {
                return cid;
            }
            public void setCid(String cid) {
                this.cid = cid;
            }
            public String getLocation() {
                return location;
            }
            public void setLocation(String location) {
                this.location = location;
            }
            public String getParent_city() {
                return parent_city;
            }
            public void setParent_city(String parent_city) {
                this.parent_city = parent_city;
            }
            public String getAdmin_area() {
                return admin_area;
            }
            public void setAdmin_area(String admin_area) {
                this.admin_area = admin_area;
            }
            public String getCnty() {
                return cnty;
            }
            public void setCnty(String cnty) {
                this.cnty = cnty;
            }
            public String getLat() {
                return lat;
            }
            public void setLat(String lat) {
                this.lat = lat;
            }
            public String getLon() {
                return lon;
            }
            public void setLon(String lon) {
                this.lon = lon;
            }
            public String getTz() {
                return tz;
            }
            public void setTz(String tz) {
                this.tz = tz;
            }
        }
        public static class UpdateBean {
            /**
             * loc : 2020-04-01 15:45
             * utc : 2020-04-01 07:45
             */
            private String loc;
            private String utc;
            public String getLoc() {
                return loc;
            }
            public void setLoc(String loc) {
                this.loc = loc;
            }
            public String getUtc() {
                return utc;
            }
            public void setUtc(String utc) {
                this.utc = utc;
            }
        }
        public static class NowBean {
            /**
             * cloud : 100
             * cond_code : 104
             * cond_txt : 阴
             * fl : 18
             * hum : 82
             * pcpn : 0.0
             * pres : 1006
             * tmp : 18
             * vis : 16
             * wind_deg : 79
             * wind_dir : 东北风
             * wind_sc : 2
             * wind_spd : 9
             */
            private String cloud;
            private String cond_code;
            private String cond_txt;
            private String fl;
            private String hum;
            private String pcpn;
            private String pres;
            private String tmp;
            private String vis;
            private String wind_deg;
            private String wind_dir;
            private String wind_sc;
            private String wind_spd;
            public String getCloud() {
                return cloud;
            }
            public void setCloud(String cloud) {
                this.cloud = cloud;
            }
            public String getCond_code() {
                return cond_code;
            }
            public void setCond_code(String cond_code) {
                this.cond_code = cond_code;
            }
            public String getCond_txt() {
                return cond_txt;
            }
            public void setCond_txt(String cond_txt) {
                this.cond_txt = cond_txt;
            }
            public String getFl() {
                return fl;
            }
            public void setFl(String fl) {
                this.fl = fl;
            }
            public String getHum() {
                return hum;
            }
            public void setHum(String hum) {
                this.hum = hum;
            }
            public String getPcpn() {
                return pcpn;
            }
            public void setPcpn(String pcpn) {
                this.pcpn = pcpn;
            }
            public String getPres() {
                return pres;
            }
            public void setPres(String pres) {
                this.pres = pres;
            }
            public String getTmp() {
                return tmp;
            }
            public void setTmp(String tmp) {
                this.tmp = tmp;
            }
            public String getVis() {
                return vis;
            }
            public void setVis(String vis) {
                this.vis = vis;
            }
            public String getWind_deg() {
                return wind_deg;
            }
            public void setWind_deg(String wind_deg) {
                this.wind_deg = wind_deg;
            }
            public String getWind_dir() {
                return wind_dir;
            }
            public void setWind_dir(String wind_dir) {
                this.wind_dir = wind_dir;
            }
            public String getWind_sc() {
                return wind_sc;
            }
            public void setWind_sc(String wind_sc) {
                this.wind_sc = wind_sc;
            }
            public String getWind_spd() {
                return wind_spd;
            }
            public void setWind_spd(String wind_spd) {
                this.wind_spd = wind_spd;
            }
        }
    }
}

这样就不用在一个个的去写Get和Set方法了,都给你生成好了。一步到位,用了之后根本停不下来。

3. 网络请求


通过上面的访问地址,我们可以看得出来,只要修改location的值就可以得到不同地方的天气数据信息了,刚才是在网页上访问的,接下来就通过Android来访问这个地址,得到数据并且显示出来。

说到网络请求,就不得不提一下OKHttp网络请求框架,刚开始你可能比较陌生,这里做一下简单的讲解。


① OKHttp


OkHttp是一个第三方类库,用于android中请求网络。这是一个开源项目,是安卓端最火热的轻量级框架。

网络请求分两种方式Post请求和Get请求


1.Post和Get的区别


浏览器对URL的长度有限制,所以GET请求不能代替POST请求发送大量数据

GET请求发送数据更小

POST请求不能被缓存

POST请求相对GET请求是「安全」的

POST请求Request Body传递参数

以上皆是个人理解,如有不对,望斧正。


2.同步和异步的区别


同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。

异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。


以上皆是个人理解,如有不对,望斧正。

3.Get的同步请求


对于同步请求在请求时需要开启子线程,请求成功后需要跳转到UI线程修改UI,示例代码如下:


public void getDataSync() {
    //创建新的线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                    Request request = new Request.Builder()
                            .url("http://www.baidu.com")//请求接口。如果需要传参拼接到接口后面。
                            .build();//创建Request 对象
                    Response response = null;
                    response = client.newCall(request).execute();//得到Response 对象
                    if (response.isSuccessful()) {
                        Log.d("kwwl", "response.code()==" + response.code());
                        Log.d("kwwl", "response.message()==" + response.message());
                        Log.d("kwwl", "res==" + response.body().string());
                        //此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


注意事项:


1,Response.code是http响应行中的code,如果访问成功则返回200.这个不是服务器设置的,而是http协议中自带的。res中的code才是服务器设置的。注意二者的区别。

2,response.body().string()本质是输入流的读操作,所以它还是网络请求的一部分,所以这行代码必须放在子线程。


3,response.body().string()只能调用一次,在第一次时有返回值,第二次再调用时将会返回null。原因是:response.body().string()的本质是输入流的读操作,必须有服务器的输出流的写操作时客户端的读操作才能得到数据。而服务器的写操作只执行一次,所以客户端的读操作也只能执行一次,第二次将返回null。


4.Get的异步请求


这种方式不用再次开启子线程,但回调方法是执行在子线程中,所以在更新UI时还要跳转到UI线程中。

private void getDataAsync() {
    //创建OkHttpClient对象
        OkHttpClient client = new OkHttpClient();
        //创建Request 对象
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {//回调的方法执行在子线程。
                    Log.d("kwwl", "获取数据成功了");
                    Log.d("kwwl", "response.code()==" + response.code());
                    Log.d("kwwl", "response.body().string()==" + response.body().string());
                }
            }
        });
    }


注意事项:


1,回调接口的onFailure方法和onResponse执行在子线程。


2,response.body().string()方法也必须放在子线程中。当执行这行代码得到结果后,再跳转到UI线程修改UI。


5.Post的同步请求


示例代码


private void postDataWithParame() {
        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("username","zhangsan");//传递键值对参数
        Request request = new Request.Builder()//创建Request 对象。
                .url("http://www.baidu.com")
                .post(formBody.build())//传递请求体
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {//回调的方法执行在子线程。
                    Log.d("kwwl", "获取数据成功了");
                    Log.d("kwwl", "response.code()==" + response.code());
                    Log.d("kwwl", "response.body().string()==" + response.body().string());
                }
            }
        });
    }


不知道你有没有看懵逼,好了,接下来我们使用异步Get来请求这个APi的数据返回。


//获取今天的天气数据
    private void getTodayWeather(String district) {
        //使用Get异步请求
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                //拼接访问地址
                .url("https://free-api.heweather.net/s6/weather/now?key=3086e91d66c04ce588a7f538f917c7f4&location="+district)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){//回调的方法执行在子线程。
                    Log.d("kwwl","获取数据成功了");
                    Log.d("kwwl","response.code()=="+response.code());
                    Log.d("kwwl","response.body().string()=="+response.body().string());
                }
            }
        });
    }

20200401171400455.png



在定位结果里面调用网络请求方法,设置参数为区/县的定位值。

运行起来,然后看一下控制台的日志打印:


20200401171547904.png


这就是通过地址请求返回的当天的天气数据


{“HeWeather6”:[{“basic”:{“cid”:“CN101280604”,“location”:“南山”,“parent_city”:“深圳”,“admin_area”:“广东”,“cnty”:“中国”,“lat”:“22.53122139”,“lon”:“113.9294281”,“tz”:"+8.00"},“update”:{“loc”:“2020-04-01 17:09”,“utc”:“2020-04-01 09:09”},“status”:“ok”,“now”:{“cloud”:“100”,“cond_code”:“104”,“cond_txt”:“阴”,“fl”:“19”,“hum”:“83”,“pcpn”:“0.0”,“pres”:“1006”,“tmp”:“18”,“vis”:“16”,“wind_deg”:“95”,“wind_dir”:“东风”,“wind_sc”:“1”,“wind_spd”:“5”}},{“basic”:{“cid”:“CN101051206”,“location”:“南山”,“parent_city”:“鹤岗”,“admin_area”:“黑龙江”,“cnty”:“中国”,“lat”:“47.31324005”,“lon”:“130.27552795”,“tz”:"+8.00"},“update”:{“loc”:“2020-04-01 17:09”,“utc”:“2020-04-01 09:09”},“status”:“ok”,“now”:{“cloud”:“0”,“cond_code”:“100”,“cond_txt”:“晴”,“fl”:“5”,“hum”:“23”,“pcpn”:“0.0”,“pres”:“988”,“tmp”:“10”,“vis”:“16”,“wind_deg”:“269”,“wind_dir”:“西风”,“wind_sc”:“3”,“wind_spd”:“19”}}]}


相关文章
|
29天前
|
缓存 监控 API
抖音抖店 API 请求获取宝贝详情数据的调用频率限制如何调整?
抖音抖店API请求获取宝贝详情数据的调用频率受限,需遵循平台规则。开发者可通过提升账号等级、申请更高配额、优化业务逻辑(如缓存数据、异步处理、批量请求)及监控调整等方式来应对。
|
1月前
|
缓存 负载均衡 API
抖音抖店API请求获取宝贝详情数据、原价、销量、主图等参数可支持高并发调用接入演示
这是一个使用Python编写的示例代码,用于从抖音抖店API获取商品详情,包括原价、销量和主图等信息。示例展示了如何构建请求、处理响应及提取所需数据。针对高并发场景,建议采用缓存、限流、负载均衡、异步处理及代码优化等策略,以提升性能和稳定性。
|
11天前
|
JSON API 数据格式
携程API接口系列,酒店景点详情请求示例参考
携程API接口系列涵盖了酒店预订、机票预订、旅游度假产品预订、景点门票预订等多个领域,其中酒店和景点详情请求是较为常用的功能。以下提供酒店和景点详情请求的示例参考
|
1月前
|
JavaScript 前端开发 Java
多种语言请求API接口方法
每种语言和库的选择取决于具体需求、项目环境以及个人偏好。了解这些基本方法,开发者就可以根据项目需求选择合适的语言和库来高效地与API交互。
39 1
|
1月前
|
存储 数据可视化 JavaScript
可视化集成API接口请求+变量绑定+源码输出
可视化集成API接口请求+变量绑定+源码输出
49 4
|
1月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
549 7
|
1月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
661 1
|
24天前
|
小程序 数据挖掘 UED
开发1个上门家政小程序APP系统,都有哪些功能?
在快节奏的现代生活中,家政服务已成为许多家庭的必需品。针对传统家政服务存在的问题,如服务质量不稳定、价格不透明等,我们历时两年开发了一套全新的上门家政系统。该系统通过完善信用体系、提供奖励机制、优化复购体验、多渠道推广和多样化盈利模式,解决了私单、复购、推广和盈利四大痛点,全面提升了服务质量和用户体验,旨在成为家政行业的领导者。
|
1月前
|
JavaScript 前端开发 小程序
uniapp一个人开发APP关键步骤和考虑因素
uniapp一个人开发APP关键步骤和考虑因素
130 1
uniapp一个人开发APP关键步骤和考虑因素
|
1月前
|
JavaScript 前端开发 UED
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
Vue与uni-app开发中通过@font-face巧妙引入自定义字体
85 9

热门文章

最新文章

下一篇
无影云桌面