Okhttp Interceptor 源码解析

作者: MrLgc | 来源:发表于2018-08-03 14:45 被阅读7次
    image10.png

    添加拦截器


    image11.png
    image12.png

    这样添加到源码中的 OkHttpClient 类集合中。


    image13.png
    RealCall类中
    下面以Call的同步方法execute()为例子
    image14.png

    在RealCall类中,进行拦截器的所有添加


    image15.png
    添加完之后,调用RealInterceptorChain类中的 proceed()方法进行拦截器处理
    image16.png image17.png

    这个方法就是循环递归的重要方法,做拦截器处理,因为每次进入一个拦截器都会把RealInterceptorChain这个对象传递过去


    image24.png

    在回调给这个对象进行循环递归

    这面举一个 HttpLoggingInterceptor 拦截器为例
    假设他是集合里面的index为0的拦截器
    Response response = interceptor.intercept(next);
    当调用这个方法的时候,会去调用 HttpLoggingInterceptor里面的


    image18.png

    这面其实就是HttpLoggingInterceptor的
    public Response intercept(Chain chain) 这个方法里面的代码
    response = chain.proceed(request);
    当调用这个的时候会在一次走到


    image20.png
    image19.png
    这个RealInterceptorChain 类里面的这个方法里面进行 index+1
    循环递归,

    对于request的拦截器处理


    image21.png

    会把新的请求给下一个拦截器保持最新的请求.
    就好比请求头,因为每add一个拦截器都会拿上一个拦截器的request,如果有拦截器处理请求则去处理request去改变request
    所以说最终的request是最完美的request
    最终把请求给到CallServerInterceptor
    拦截器中,也就是循环递归


    image22.png
    CallServerInterceptor 里面的 Response intercept(Chain chain)
    image23.png

    通过request拿到请求的response
    返回给每一个拦截器进行reponse处理。

    相关文章

      网友评论

        本文标题:Okhttp Interceptor 源码解析

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