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