美文网首页
okhttp思考

okhttp思考

作者: enjoycc97 | 来源:发表于2018-07-26 00:16 被阅读0次

    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协议的学习。

    相关文章

      网友评论

          本文标题:okhttp思考

          本文链接:https://www.haomeiwen.com/subject/tecvmftx.html