Okhttp的使用与解析

 

一、Okhttp 简介

 

OkHttp是一个处理网络请求的开源框架。

网络请求发展:HttpURLConnection—>Apache HTTP Client—>Volley—->okHttp

 

二、Okhttp的使用

Get请求

//1 . 拿到OkHttpClient对象
OkHttpClient client = new OkHttpClient();

//2 . 构造Request对象
Request request = new Request.Builder()
                .get()
                .url("https:www.baidu.com")
                .build();

//3 . 将Request封装为Call
Call call = client.newCall(request);

//4 . 根据需要调用同步或者异步请求方法
//同步调用,返回Response,会抛出IO异常
Response response = call.execute();

//异步调用,并设置回调函数
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        final String res = response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                contentTv.setText(res);
            }
        });
    }
});

 

Post请求

//1 . 拿到OkHttpClient对象
OkHttpClient client = new OkHttpClient();

//2 . 构建RequestBody
File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
    Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}else{
    RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
}

//3 . 构建Request,将RequestBody作为Post方法的参数传入
final Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                .post(requestBody )
                .build();

//4 . 将Request封装为Call
Call call = client.newCall(request);

//5 . 调用请求,重写回调方法
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Toast.makeText(OkHttpActivity.this, "Post Failed", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        final String res = response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                contentTv.setText(res);
            }
        });
    }
});

三、Interceptor

okhttp-interceptors

 

 

 

拦截器的作用

拦截器可以拿到网络请求的 Request 对象和 Response 对象,有了这两个对象我们就可以对网络请求进行监听(打印日志)、缓存、修改 HTTP 的请求报文和响应报文。

如何使用拦截器

1、实现 Interceptor 接口,重写 intercept() 函数获取并返回响应 Response 的对象。
2、在建造 OkHttpClient 类的对象时调用 addInterceptor() 或 addNetworkInterceptor() 方法设置拦截器。

拦截器类型

  • 自定义拦截器,可以自定义一个实现Interceptor的类,通过addInterceptor或者addNetworkInterceptor添加到interceptors集合中。
  • RetryAndFollowUpInterceptor,主要进行网络请求失败重试及重定向操作
  • BridgeInterceptor,主要用于添加Request的Header添加及GZIP压缩/解压操作
  • CacheInterceptor,主要进行缓存存储、更新等操作
  • ConnectInterceptor,主要是通过Socket与服务器建立一个连接并将该连接存储到连接池中
  • CallServerInterceptor,主要是与服务器进行数据读写操作

 

四、Okhttp源码解析

1. 请求发送到哪里去了?

请求被发送运行中的队列和等待中的队列。

运行中的队列小于64。并且访问同一服务器的请求,数量小于5的时候直接添加到运行中,不然添加到等待队列中。

2. 请求是怎么被消费的?

当添加到运行中的队列时,立即交给线程词进行处理,相当于直接访问服务器。

3. 请求怎么被维护的?

当一个请求被处理完之后,会调用一个方法去检测,等待队列和运行队列中的数据进行交互。

 

五、OkHttp的优点

  • 内置连接池,支持连接复用;
  • 支持gzip压缩响应体;
  • 通过缓存避免重复的请求;
  • 支持http2,对一台机器的所有请求共享同一个socket;
  • 功能全面,满足了网络请求的大部分需求;
  • 责任链模式使得很容易添加一个自定义拦截器对请求和返回结果进行处理。

 

 

参考链接 https://www.jianshu.com/p/9aa969dd1b4d

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值