概述
从OkHttp问世以来,度娘,google上关于OkHttp的讲解说明数不胜数,各种解读思想不尽相同,一千个读者就有一千个哈默雷特。本篇文章从源码出发向你介绍Okhttp的基本使用以及底层实现原理,让你从会写转向会用,学习Android顶尖源码的设计理念和开源扩展性,如果解读有误,还望提出探讨纠正。
文章链接:
Android OkHttp源码解析入门教程:同步和异步(一)
Android OkHttp源码解析入门教程:拦截器和责任链(二)
工欲善其事,必先利其器
Android API23(6.0)版本以后,谷歌正式移除Apache-HttpClient,OkHttp 作为一个现代,快速,高效的HttpClient,其功能之强大也是显而易见的的
1.支持SPDY 可以合并多个请求到同一个主机的请求,连接池,GZIP和HTTP缓存
2.支持HTTP / 2协议,通过HTTP / 2可以让客户端中到服务器的所有请求共用同一个Socket连接
3.非HTTP / 2请求时, OkHttp内部会维护一个线程池,通过线程池可以对HTTP / 1.x的连接进行复用,减少延迟
4.支持后,得到请求,基于HTTP的文件上传和下载
5.默认情况下,OkHttp会自动处理常见的网络问题,像二次连接,SSL的握手问题
当然OkHttp的功能远不止这些,这里只是说明平时经常用到的。既然OkHttp已经作为官方库使用,相比我们在做项目的时候也会用,但对于其底层的实现原理还是一知半解,那我们就。从这篇文章开始解释其底层实现原理开车前先来一波介绍:
Ecplise引用:下载最新的瓶子包
Android studio引用:
implementation 'com.squareup.okhttp3:okhttp:3.11.0' //最新版本号请关注okhttp官网
Maven引用:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version> //最新版本号请关注okhttp官网
</dependency>
各位老司机们,马上开车,嘀嘀嘀!
一,基本使用方法
流程如下
// 启动客户端类,主要有两种方法进行创建,new对象和Builder内部类实现实例化
OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
// get请求
// 通过Builder模式创建一个Request对象(即请求报文)
// 这里可以设置请求基本参数:url地址,get请求,POST请求,请求头,cookie参数等
Request request = new Request.Builder()
.url("http://www.baidu.com")
.header("User-Agent", "xxx.java")
.addHeader("token", "xxx")
.get()
.build();
// POST请求
// 表单形式上传
RequestBody body = new FormBody.Builder().add("xxx","xxx").build();
// JSON参数形式,File对象上传
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
RequestBody body = RequestBody.create(MediaType.parse("File/*"), file);
Request request = new Request.Builder()
.post(body)
.url(url)
.header("User-Agent", "xxx.java")
.addHeader("token", "xxx")
.build();
// 创建Call对象(Http请求) ,即连接Request和Response的桥梁
// newCall方法将request封装成Call对象
Call call = client.newCall(request);
try{
// Response即响应报文信息,包含返回状态码,响应头,响应体等
Response response = call.execute();
// 这里深入一点,Call其实是一个接口,调用Call的execute()发送同步请求其实是调用了Realcall实现类的方法,这点会在下面源码进行详细分析
System.out.println(response.body().string());
}catch(IOException e){
e.printStackTrace();
}
看完代码你可能觉得OkHttp基本流程很繁琐,但是去掉一些扩展参数,你会发现OkHttp的使用其实很简单,无非就是
1.创建一个OkHttpClient并