如何使用Okhttp发送Get请求

在开发中大部分请求都是Get请求,比如:列表的数据展示,详情界面的现实,用户头像的现实等他们都是Get请求,顾名思义就是获取到某个地址的信息。下面来看看Okhttp中是怎么支持Get请求的呢?

同步Get请求

比如我们获取到我的博客主页,我的博客主页是:http://me.woblog.cn。可以这样来写:

//这里创建OkHttpClient,建议一个应用只有一个

final OkHttpClient client = new OkHttpClient();

//然后创建一个线程,因为我们这里学习的同步请求,当然你也可以在AsyncTask这样的异步任务里面同步调用

new Thread() {  

    @Override  public void run() {    

        super.run();   

         //创建一个Request,他里面包括的你要请求的网址等信息,

        // 同时这个类是构建者模式,我们在源码分析的时候会详解讲解

        Request request = new Builder()

        .url(“http://me.woblog.cn/”)        

        .build();   

         try {     

             //然后调用newCall方法,传入刚刚创建的Request对象      

            // 然后调用execute方法来执行这个请求    

            Response response = client.newCall(request).execute();     

           //通过调用response的body上的string方法可以得到流的字符串     

            Log.d(“TAG”, response.body().string());                //bytes数组   

            byte[] bytes = response.body().bytes();                  //输入流      

            InputStream inputStream = response.body().byteStream();     

            //字符串流      

            Reader reader = response.body().charStream();    

            } catch (IOException e) { 

               e.printStackTrace();    

               }  

        }

}.start();

总结起来就是:

1. 不管是异步还是通过都是先创建OkHttpClient,建议全局只有一个

2. 然后使用Request的内部类Builder来创建一个Request,并设置网址

3. 调用newCall的newCall方法传入request

4. 调用newCall方法返回的Call对象上面的execute来执行这个请求

5. 调用response的isSuccessful方法来判断是否请求成功

6. 调用response的body上面的string方法来获取一个字符串结果

我还可以通过response.body()的其他方法拿到bytes数组,输入流等信息。

其中我们拿到了输入流或者bytes数组我们可以用来手动解码一张图片,或者下载一个文件。

InputStream和Reader的区别

这个两个类我想做Android可能大家都不太熟悉,他们都是Java基础,但是这里又必要他们的区别:

InputStream:表示所有字节输入流的超类

Reader:表示所有字符输入流的超类

所以说他们的主要区别就是一个读取出来的是字节流,一个是字符流。

大家可能对读取一个文件的一行有印象,要实现该功能时我们需要将InputStream包装成Reader流。其他的就不延伸了,毕竟我们这本书主要讲的是Okhttp,关于这方面的信息大家有不太熟悉的可以参考其他的Java书籍。

异步Get请求

异步在Android中也是很常用的,我们来看看:

//同样还是先创建的request

Request request = new Request.Builder()        .url(“http://me.woblog.cn/”)    

    .build();

//将newCall返回的Call对象加入调度队列

//同时这里传入了一个Callback对象,这就是异步回调

client.newCall(request).enqueue(new Callback() {  

    @Override  

    public void onFailure(Call call, IOException e)      {   

         //在这里错误处理            Log.d(TAG,e.getMessage());  

    }  

    @Override 

    public void onResponse(Call call, Response response) throws IOException {   

         //这里获取结果,和上面的同步调用获取方式一样        

         Log.d(TAG,response.body().string()); 

     }

});

其中需要注意的是上面的onFailure,onResponse方法的调用虽然是异步调用的,但并不是在主线程,也就是说不能再改方法里面操作UI,比如:像下面这样是不允许的:

client.newCall(request).enqueue(new Callback() {  

    @Override  

    public void onFailure(Call call, IOException e) {    

        //这里不能操作UI            tv.setText(e.getMessage()); 

    }  

    @Override 

    public void onResponse(Call call, Response response) throws IOException {    

        //这里不能操作UI            tv.setText(response.body().string());  

    }

});

数据取回来不能直接更新UI那还干嘛,是吧?如果想学可以在http://www.ixuea.com/books/1(需要付费)

本文来自《详解Okhttp网络框架电子书》,视频教程也可以通过:爱学啊官网腾讯课堂网易云课堂淘宝教育学习

《如何使用Okhttp发送Get请求》

    原文作者:爱学啊
    原文地址: https://www.jianshu.com/p/a18823b264bf
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞