1 学习一个Get请求最简单的使用流程
首先学会怎么用然后才去分析内部原理
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url("http://news.baidu.com").build();
Response response=client.newCall(request).execute();
response.body().string()
2 流程有OkHttpClient,Request,Response
Request=>RealCall=>Response
3这时候大致理解了一个最简单的请求触发是怎么样子的。
4核心代码执行也就是网上常见的execute。通过分析execute原理,
大致就可以知道http中Get是怎么触发的。关键函数是getResponseWithInterceptorChain
@Override
public Response execute() throws IOException {
synchronized (this) {
if (executed) throw new IllegalStateException("Already Executed");
executed = true;
}
try {
client.dispatcher().executed(this);
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} finally {
client.dispatcher().finished(this);
}
}
5private Response getResponseWithInterceptorChain() throws IOException {
// Build a full stack of interceptors.
List<Interceptor> interceptors = new ArrayList<>();
//1.添加 client 携带的所有 interceptors (配置 OkHttpClient 时候用户设置的 interceptors )
interceptors.addAll(client.interceptors());
//2.添加 retryAndFollowUpInterceptor (负责失败重试以及重定性)
interceptors.add(retryAndFollowUpInterceptor);
//3.添加由 client.cookieJar() 构建的 BridgeInterceptor(负责把用户构造的请求转换为发送到服务器的请求、把服务器返回的相应转换为用户友好响应 - 即客户端与服务器端沟通的桥梁)
interceptors.add(new BridgeInterceptor(client.cookieJar()));
//4.添加由 client.internalCache() 构建的 CacheInterceptor (负责读取缓存直接返回、更新缓存)
interceptors.add(new CacheInterceptor(client.internalCache()));
//5.添加由 client 构建的 ConnectInterceptor (负责与服务器建立连接)
interceptors.add(new ConnectInterceptor(client));
//如果 forWebSocket 则添加 client 携带的所有 networkInterceptors(配置OkHttpClient 时候用户设置的 networkInterceptors)
if (!retryAndFollowUpInterceptor.isForWebSocket()) {
interceptors.addAll(client.networkInterceptors());
}
//添加 CallServerInterceptor (负责向服务器发送给请求数据、从服务器读取响应数据)
interceptors.add(new CallServerInterceptor(
retryAndFollowUpInterceptor.isForWebSocket()));
//构建 Interceptor.Chain ,最后调用 chain.proceed(originalRequest),第7点有解析
Interceptor.Chain chain = new RealInterceptorChain(
interceptors, null, null, null, 0, originalRequest);
return chain.proceed(originalRequest);
}
这里设计模式责任链模式,也就是说每一个拦截器都干一件事情,干不了交给下一个拦截链去处理。直到最后一个
6 同步异步是什么。每个拦截器都干了什么。重定向,重试,okio,建立连接,http1.1 http2。
慢慢挖掘,其实会发现本身不光是学习http框架更是对http协议的学习。
网友评论