在Android端,比较有名的是OkHttp和Retrofit,后者在网络请求又是依赖OkHttp的。所以说OkHttp是Android世界里最出名的框架也不为过,今天,我们就来认真分析一下这个框架,依照我务实的风格,这篇文章绝对不会是为了读源码而读源码。
HTTP简介
分析这个Http框架,我们就先从Http谈起,Http是互联网上应用最普遍的通讯协议。而所谓通讯协议,就是指通讯双方约定好传输数据的格式。所以要理解Http,只需要理解Http传输数据的格式,下面是Http数据传输双方的大致的数据格式。
上图列出的并不够详细,因为我们并不是想研究Http本身。
从上图可以看到,一个Http请求本身其实很简单。
从客户端的角度来看
- 装配Request(涉及到请求方法,url,cookie等等)
- Client端发送request请求
- 接收服务端返回的Response数据
是不是简单到令人发指?说起来这和大象装冰箱其实还蛮像的。
一个简单的OkHttp请求
结合上面的步骤,我们来看看在OkHttp框架是怎么完成简单一个网络请求的呢?
//构造RequestRequest req=new Request.Builder() .url(url) .build();//构造一个HttpClientOkHttpClient client=new OkHttpClient();//发送请求client.newCall(req) .enqueue(new Callback() { //获得服务器返回的Response数据 @Override public void onResponse(Call arg0, Response arg1) throws IOException { } @Override public void onFailure(Call arg0, IOException arg1) { // TODO Auto-generated method stub } });
你瞧,这些步骤和我们预想的都是一样的,OKHttp为你封装了那些复杂,繁琐的东西,只给你你想要的和你需要的。
既然它把Http请求封装得如此简单,它的内部的设计是否也非常的严谨呢?
首先给出OkHttp框架的整个处理流程:
可以看到,OKHttp的框架中,构造Request和HttpClient两个过程其实还是很简单的,而发送请求的过程则显得十分复杂,当然也是最精彩的部分。
下面我们就按照客户端Http请求的流程来看看OKHttp框架的源码。
构造Request
public final class Request { ....... ..... public static class Builder { private HttpUrl url; private String method; private Headers.Builder headers; private RequestBody body; private Object tag; } }
使用builder的方式,来插入请求的数据,构建Request,Builder模式相信大家非常熟悉了,所以这里仅仅给出它可构造的参数。
虽然说是构建Request,其实也言过其实,因为你能看到实际上这些数据是不足以构建一个合法的Request的,其他待补全的信息其实是OkHttp在后面某个环节帮你加上去,但至少,在开发者来看,第一步构建Request此时已经完成了。
构造OKHttpClient
public class OkHttpClient implements Cloneable, Call.Factory, WebSocketCall.Factory { ...... ...... public static final class Builder { Dispatcher dispatcher; Proxy proxy; List protocols; List connectionSpecs; final List interceptors = ne