首页 > 解决方案 > 是否需要再次创建拦截器来更新标头?

问题描述

安卓工作室 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

标签: androidretrofit2

解决方案


我对此的解决方案:

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()
    }
}

推荐阅读