美文网首页
Okhttp拦截器

Okhttp拦截器

作者: 半生黑豆 | 来源:发表于2020-06-11 17:25 被阅读0次

    今天,就在我“愉快的”敲代码的时候,后台突然伸过细长的脖子对我说到“你在调接口的时候要注意点,除了登录接口意外全部要加上token”。看起来没有任何商量的余地,我就只能去加上了,于是有了如下的代码

    指定请求添加header

         Interceptor interceptor = chain -> {
                HttpUrl httpUrl = chain.request().url().newBuilder().build();
                String path = httpUrl.encodedPath();
                if (!"/login".equals(path)) {
                    builder.addHeader("token", SharedPreferencesUtil.read(USER_TOKEN, ""))        
                }  
                Request.Builder builder = chain.request().newBuilder().url(httpUrl);
               //打印自己添加的token 
                Headers headers = builder.build().headers();
                for (int i = 0; i < headers.size(); i++) {
                    String tokenName= headers.name(i);
                    String tokenValue = headers.get(headerName);
                    Log.d(TAG "tokenName:" + tokenName);
                    Log.d(TAG "tokenValue: " + tokenValue);
                }
                return chain.proceed(request).newBuilder().build();
            };
    

    完事后,自己测试了一番,没有问题,效果杠杠的。

    过了几天,后台又伸过了细长的脖子对我说到“我这上传文件的服务器地址单独拿出来了,所以你调接口的时候要注意点”。还是原来的味道,一点商量余地没有。当时为了不影响使用,直接将请求初始化类复制出来一份,BaseUrl设置成文件服务器地址,单独给上传文件的接口用。虽然凑合也能用,但毕竟太不程序员了。于是,顺着先前给指定请求添加token的思路,进入httpurl的源码看了一眼,嘿,这注释太赞了,就以先前的encodedPath()方法为例看一眼。

    /**
       * The entire path of this URL encoded for use in HTTP resource resolution. The returned path will
       * start with `"/"`.
       *
       * | URL                     | `encodedPath()` |
       * | :---------------------- | :-------------- |
       * | `http://host/`          | `"/"`           |
       * | `http://host/a/b/c`     | `"/a/b/c"`      |
       * | `http://host/a/b%20c/d` | `"/a/b%20c/d"`  |
       */
      @get:JvmName("encodedPath") val encodedPath: String
        get() {
          val pathStart = url.indexOf('/', scheme.length + 3) // "://".length() == 3.
          val pathEnd = url.delimiterOffset("?#", pathStart, url.length)
          return url.substring(pathStart, pathEnd)
        }
    

    真正做到了简单明了。代码修改后如下:

       Interceptor interceptor = chain -> {
                HttpUrl requestUrl = chain.request().url().newBuilder().build();
                String path = requestUrl.encodedPath();
    
                Request.Builder builder;
                if ("/upload/videoFiles".equals(path) || "/upload/pcfiles".equals(path)) {
                    String newUrl = Constant.PHOTOS_URL + path;
                    builder = chain.request().newBuilder().url(newUrl);
                } else {
                    builder = chain.request().newBuilder().url(requestUrl);
                }
    
                if (!"/login".equals(path)) {
                    builder.addHeader("token", SharedPreferencesUtil.read(USER_TOKEN, ""))
                            .addHeader("datafrom", "1");
                }
                return chain.proceed(builder.build()).newBuilder().build();
            };
    

    思路也很简单,就是比对path,如果是上传文件的path,就将request的url重新拼接,并且设置给request

    相关文章

      网友评论

          本文标题:Okhttp拦截器

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