android - 是否需要再次创建拦截器来更新标头?
问题描述
安卓工作室 3.6
我有一个带有标头的 http 客户端(Retrofit 2.6)。
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
public class RestClientFactory {
private static Interceptor headerInterceptor;
headerInterceptor = chain -> {
Request originalRequest = chain.request();
Request newRequest = originalRequest.newBuilder()
.header("Authorization", "")
.build();
return chain.proceed(newRequest);
};
httpClient.addInterceptor(headerInterceptor);
}
我需要在某些事件之后更新标题“授权”。为此,我使用方法addHeader
:
public static void addHeader(String tokenBackend) {
headerInterceptor = chain -> {
Request originalRequest = chain.request();
Request newRequest = originalRequest.newBuilder()
.header("Authorization", tokenBackend)
.build();
return chain.proceed(newRequest);
};
}
这是工作。好的。但在addHeader
我创建的方法中headerInterceptor
。是否只能更新当前headerInterceptor
?
解决方案
我对此的解决方案:
class BasicAuthInterceptor: Interceptor {
private var mEncodedAuthorizationSection: String? = null
private val authorizationHeaderValue: String
get() = String.format("Basic %s", mEncodedAuthorizationSection)
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
var request = chain.request()
if (canAttemptAuthorization()) {
val requestBuilder = request.newBuilder()
requestBuilder.addHeader("Authorization", authorizationHeaderValue)
request = requestBuilder.build()
}
return chain.proceed(request)
}
fun setAuthorization(username: String?, password: String?) {
if (username == null || username.isEmpty() || password == null || password.isEmpty()) {
return
}
val unencodedConcatenization = String.format("%s:%s", username, password)
mEncodedAuthorizationSection = Base64.encodeToString(unencodedConcatenization.toByteArray(), Base64.NO_WRAP)
}
fun setAuthorizationValue(value: String?) {
mEncodedAuthorizationSection = value
}
private fun canAttemptAuthorization(): Boolean {
return mEncodedAuthorizationSection != null && !mEncodedAuthorizationSection.isNullOrEmpty()
}
}