茶水 發表於 2019-9-15 15:39:00

Android 开发 框架系列 OkHttp拦截器

<h1><span style="color: rgba(0, 128, 128, 1)">版权声明</span></h1>
<p>本文来自博客园,作者:观心静&nbsp;,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11522959.html</p>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。</div>
<h1><span style="color: rgba(0, 128, 128, 1)">前言<br></span></h1>
<p><span style="color: rgba(0, 128, 128, 1)">  <span style="color: rgba(0, 0, 0, 1)">此篇博客只讲解okhttp的拦截器功能的详细使用,如果你还不太了解okhttp可以参考我另外一篇博客</span> </span>Android 开发 框架系列 OkHttp使用详解</p>
<div>
<h1><span style="color: rgba(0, 128, 128, 1)">添加Interceptor的简单例子</span></h1>
<p>在<span style="color: rgba(0, 128, 128, 1)"> Android 开发 框架系列 OkHttp使用详解</span> 可以了解到okhttp的基本使用,初始化OkHttpClient的时候我们可以添加拦截器,如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 配置一些信息进入OkHttpClient</span>
mOkHttpClient = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OkHttpClient().newBuilder()
                .connectTimeout(REQUEST_TIME, TimeUnit.SECONDS)
                .readTimeout(REQUEST_TIME, TimeUnit.SECONDS)
                .writeTimeout(REQUEST_TIME, TimeUnit.SECONDS)
                .addInterceptor(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> <code class="java"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">My<span class="hljs-title">Interceptor</span></span></span></span></code>()) .build();</span></pre>
</div>
<p>如上代码,很简单,只要利用addInterceptor方法就可以添加拦截器,而自定义的拦截器只需要实现<code>Interceptor</code>接口就行了,如下所示:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MyInterceptor <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Interceptor {
      ...
}</span></pre>
</div>
<p>&nbsp;<code>在有简单的了解后,我们来讲解拦截器的一些使用情景.</code></p>
<h1><span style="color: rgba(0, 128, 128, 1)">修改header头部信息</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">在一些接口需要增加头部信息或者修改头部信息的时候,如果我们直接对Request请求里增加头部字段难免会有增加耦合的问题.而在拦截器里修改就可以避免严重的耦合,如下代码增加了Body的类型与token信息.</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> HttpHeaderInterceptor <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Interceptor {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String token;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> HttpHeaderInterceptor(String token) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.token =<span style="color: rgba(0, 0, 0, 1)"> token;
      }

      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> Response intercept(@NonNull Chain chain) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IOException {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">配置请求头</span>
            String accessToken = "token"<span style="color: rgba(0, 0, 0, 1)">;
            Request.Builder builder </span>=<span style="color: rgba(0, 0, 0, 1)"> chain.request().newBuilder();
            builder.header(</span>"Content-Type", "application/json") <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">增加body类型</span>
                  .header("Accept", "application/json"<span style="color: rgba(0, 0, 0, 1)">);
            builder.header(accessToken, token); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">增加token</span>
            Request request =<span style="color: rgba(0, 0, 0, 1)"> builder.build();
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> chain.proceed(request); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">继续发送</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">拦截取消请求</span></h1>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> HttpHeaderInterceptor <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> Interceptor {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String token;

      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> HttpHeaderInterceptor(String token) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.token =<span style="color: rgba(0, 0, 0, 1)"> token;
      }

      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> Response intercept(@NonNull Chain chain) <span style="color: rgba(0, 0, 255, 1)">throws</span><span style="color: rgba(0, 0, 0, 1)"> IOException {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">配置请求头</span>
            <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (TextUtils.isEmpty(token)){<br>          //自定义返回结果
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Response.Builder()
                        .code(</span>405<span style="color: rgba(0, 0, 0, 1)">)
                        .protocol(Protocol.HTTP_2)
                        .message(</span>"Secret is empty"<span style="color: rgba(0, 0, 0, 1)">)
                        .body(ResponseBody.create(MediaType.get(</span>"text/html; charset=utf-8"),""<span style="color: rgba(0, 0, 0, 1)">))
                        .request(chain.request())
                        .build();
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">略......</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }</span></pre>
</div>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">网络日志拦截</span></h1>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(0, 0, 0, 1)"><strong><span style="color: rgba(255, 0, 0, 1)">请注意!</span> 如果你OkHttpClient需要用于下载文件请不要添加网络日志拦截,否则会影响流的回调</strong></span></p>
<p><span style="color: rgba(0, 0, 0, 1)">使用okhttp网络日志拦截器需添加以下依赖:<br><br></span></p>
<div class="cnblogs_code">
<pre>implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'</pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"><br>定义拦截器中的网络日志工具:<br><br></span></p>
<div class="cnblogs_code">
<pre> HttpLoggingInterceptor logInterceptor = <span style="color: rgba(0, 0, 255, 1)">new HttpLoggingInterceptor(<span style="color: rgba(0, 0, 255, 1)">new<span style="color: rgba(0, 0, 0, 1)"> HttpLoggingInterceptor.Logger() {

            @Override
            <span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> log(String message) {
               Log.d("logInterceptor"<span style="color: rgba(0, 0, 0, 1)">, message);
            }
      });
      logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); <span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">设置拦截器,不要忘记设置日志的级别,否则会不回调数据</span></span></span></span></span></span></span></span></span></span></span></span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"><br>初始化OkHttpClient,并添加网络日志拦截器:<br></span></p>
<div class="cnblogs_code">
<pre>mOkHttpClient = <span style="color: rgba(0, 0, 255, 1)">new<span style="color: rgba(0, 0, 0, 1)"> OkHttpClient.Builder()
                  .addInterceptor(<span style="color: rgba(0, 0, 0, 1)">logInterceptor) <span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">设置拦截器
                  .build();</span></span></span></span></span></pre>
</div>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: center">
    <p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11522959.html </p>
    <div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/11522959.html
頁: [1]
查看完整版本: Android 开发 框架系列 OkHttp拦截器