Android-okhttp获取json数据及解析

作者: 3a7e0b22a5df | 来源:发表于2017-12-04 20:27 被阅读33次

    Okhttp简介

    okhttp是目前android开发中比较流行的一个开源网络请求框架,相比于官网api提供的网络接口有很多优点。
    android6.0以前,官方sdk提供的是httpUrlConnection,android6.0以后,已经将这个框架移除了,目前最常见是okhttp

    优点
    • 1.支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求
    • 2.缓存响应数据来减少重复的网络请求
    • 3.即便是网络出现问题时,okhttp依然起作用.它将从常见的链接问题当中回复.
    • 4.如果你的服务器有多个IP地址,当地一个失败时,okhttp会自动尝试连接其他的地址

    okhttp使用方法

    使用方法很简单,只需要在gradle中添加一下依赖,就可自动把需要的jar包引入进来

    compile 'com.squareup.okhttp3:okhttp:3.4.1'
    

    同时是要需要注意的是,网络请求需要请求权限
    在AndroidMainfest.xml中添加网络权限,如下

     <uses-permission android:name="android.permission.INTERNET"/>
    

    okhttp获取json数据

    移动应用的开发,难免要用到json数据的获取,一般都是请求数据,然后将数据返回,再进行解析。
    由于网络请求可能在多个地方用到,我们可以将起封装成httpUtil类。

    1.新建名为HttpUtil的java 类
    异步请求方法
    public class HttpUtil {
        
        public static void sendRequestWithOkhttp(String address,okhttp3.Callback callback)
        {
            OkHttpClient client=new OkHttpClient();
            Request request=new Request.Builder().url(address).build();
            client.newCall(request).enqueue(callback);
        }
    }
    

    可以看到,我们在类中定义了sendRequeWithOkhttp函数,这就是对于请求函数的封装,每次调用只需把url地址和Callback参数传入即可。
    第一步,创建OkhttpClient对象
    第二步,通过builde()创建Request对象,并且传入url
    第三步,这里创建的是匿名Call对象,将请求放入,enqueue()是异步请求方式。

    需要说明的,get请求分为同步和异步,上面的例子是异步的,即传入的Callback参数类似于一个接口,okhttp会自动开启子线程,当请求成功时再回调,通过这种回调机制,我们可以避免服务器响应慢而导致的请求数据失败。(如何回调在后面会展示)

    同步请求方法
    public class HttpUtil {
        
        public static String sendRequestWithOkhttp(String address)
        {
           OkHttpClient client=new OkHttpClient();
           Request request = new Request.Builder().url(url) .build();
           Response response= client.newCall(request).execute();
           String message=response.body().string();
            return message;
        }
    }
    

    可以看到,同步请求后,直接返回string数据即可。
    为了避免上述提到的问题,我们将以异步请求为例。

    2.activity中进行网络请求操作
    HttpUtil.sendRequestWithOkhttp("http://guolin.tech/api/china", new okhttp3.Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
    
                        }
    
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            parseJsonWithJsonObject(response);
                      
                        }
                    });
                }
    

    我们可以直接调用刚才编写的网络请求工具类,传入url地址即可,这里用到的是郭霖大神的教学地址,它可以返回json数据。
    可以看到,我们传入okhttp3.Callback参数即可实现回调,当请求成功时,自动调用onResponse函数,当请求失败,调用onFailure函数。在onResponse中即可以对请求所返回的response进行处理,将其转化为String类型。

    3.解析json数据
    [{"id":1,"name":"北京"}
    
    • 类似于这样的就是json类型的数据,由两部分组成,键与值构成键值对。
      如id name 即为键 1 北京即为值
    • 可以根据键来取出对应的值,这其实是一种很巧妙的数据存储方式
    • 在2中可以看到有一个 parseJsonWithJsonObject(response)函数,这其实是对json解析的封装。
    private void parseJsonWithJsonObject(Response response) throws IOException {
                responseData=response.body().string();
            try{
                JSONArray jsonArray=new JSONArray(responseData);
                for(int i=0;i<jsonArray.length();i++)
                {
                    JSONObject jsonObject=jsonArray.getJSONObject(i);
                    String id=jsonObject.getString("id");
                    String name=jsonObject.getString("name");
                    idList.add(id);
                    nameList.add(name);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    

    这里采用的是JSONobject方式解析json数据。当然,还有另一种解析方式,这里不具体讲。
    首先我们将传入的response转为string对象,然后创建一个jsonArray对象,在转化为jsonobject对象。最后根据json的键取出对应的值

    总结

    本文主要对请求和解析这两个重要的点进行讲解,对于解析出的数据如何处理细节不再详细讲,测试的时候可以把数据放在listview展示出来,看编写有没有成功。

    相关文章

      网友评论

        本文标题:Android-okhttp获取json数据及解析

        本文链接:https://www.haomeiwen.com/subject/zuqfixtx.html