Okhttp拦截器

今天,就在我“愉快的”敲代码的时候,后台突然伸过细长的脖子对我说到“你在调接口的时候要注意点,除了登录接口意外全部要加上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拦截器)