Android 开发中OkHttp3解析

1、简要概述

    OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

OkHttp官网地址:http://square.github.io/okhttp/ 
OkHttp GitHub地址:https://github.com/square/okhttp 

2、配置方法

Eclipse直接导入jar依赖就行,对应最新的okhttp下载地址,另外okhttp内部依赖okio,最新的okio下载地址

AndroidStudio配置方法,直接在build.gradle中添加如下代码

compile 'com.squareup.okhttp3:okhttp:3.6.0'
或者通过选中项目,右键里选择“Open Module Settings”,然后在下图里选择搜索okhttp即可,会自动在build.gradle里添加上上面那行


配置完成后我们就来看看简单的使用

3、简单使用

3.1 利用OkHttp发送get请求

同步方法execute,代码如下

    public void okHttpGetByExecute() {
        OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();

        Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").
                build();
        //当然你也可以通过Request.Builder设置更多的参数比如:header、method等
        //new Request.Builder().addHeader(name ,value)
        try {
            Response response = okHttpClient.newCall(request).execute();
            if (response.isSuccessful()) {
                mHandler.sendMessage(mHandler.obtainMessage());
                //r注意esponse.body().toString打印的是Responsebody对象
                Log.d(TAG, response.body().string());
            } else {
                throw new IOException("Unexpected code " + response);
            }
        } catch (IOException e) {
            Log.d(TAG, " test1 e :" + e.toString());
            e.printStackTrace();
        }
    }

利用enqueue异步访问,代码如下

    public void okHttpGetByEnqueue() {
        OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();

        Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").
                build();
        //当然你也可以通过Request.Builder设置更多的参数比如:header、method等
        //new Request.Builder().addHeader(name ,value)
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                mHandler.sendMessage(mHandler.obtainMessage());
                //r注意esponse.body().toString打印的是Responsebody对象
                Log.d(TAG, response.body().string());
            }
        });
    }

以上就是利用okhttp实现的两种get访问方式,简单总结下,分三步

1.构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。

2.通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute(),enqueue(),cancel()等方法

3.调用Call对象的execute()或enqueue()发起get请求

onResponse回调的参数是response,一般情况下,获得返回的字符串,可以通过response.body().string();获得返回的二进制字节数组,则调用response.body().bytes();需要返回的inputStream,则调用response.body().byteStream(),

enqueue()和execute()区别:

同步时execute()返回Response就可以更新UI,异步时在callback的onResponse触发时可更新UI。同步方法会阻塞线程,不要在UI线程使用

3.2 利用OkHttp发送post请求

通过post发起请求和get类似,只是在post方法里需要传入一个RequestBody,可以通过FormBody键值对方式创建请求体,也可以通过json数据,具体使用方法参见下面代码:
  public void okHttpPosyByEnqueue(String json) {
        OkHttpClient okHttpClient = OkhttpUtis.getOkHttpClientInstace();

        //1.通过键值对添加RequestBody start
//        FormBody.Builder builder = new FormBody.Builder();
//        RequestBody requestBody = builder.add("username", "jason").add("password", "123456").build();
        //1.通过键值对添加RequestBody end
        //2.通过json提交数据
        MediaType parse = MediaType.parse("application/json; charset=utf-8");
        RequestBody requestBody = RequestBody.create(parse, json);
        Request request = new Request.Builder().url("http://blog.csdn.net/yin1031468524").post(requestBody).build();
        //当然你也可以通过Request.Builder设置更多的参数比如:header、method等
        //new Request.Builder().addHeader(name ,value)
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.d(TAG, e.toString());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //r注意esponse.body().toString打印的是Responsebody对象
                Log.d(TAG, response.body().string());
            }
        });
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值