android - 为什么我不能在 Retrofit 中向拦截器请求 OkHttp 添加 header ?

标签 android rest retrofit interceptor

能否请您指出我在代码中的错误,我无法将 header “授权”添加到拦截器。当我发出请求时,它会抛出错误 retrofit2.adapter.rxjava.HttpException: HTTP 401 Unauthorized 。但是当我为每个请求添加 Header token 时

@Header("Authorization") String token

然后就可以了。

这是我的代码:

 protected Retrofit retrofit;
protected OkHttpClient client;
protected T api;
protected UserCredential userCredential;

public RestClient(Class<T> type) {
    if (client == null) {
        synchronized (OkHttpClient.class) {
            client = new OkHttpClient();
            client.newBuilder().addInterceptor(chain -> {
                Request original = chain.request();
                Request.Builder builder = original.newBuilder();
                if (GrabDoiApplication.getInstance().getCurrentCredentials() != null) {
                    String token = GrabDoiApplication.getInstance().getCurrentCredentials().getToken();
                    if (token != null) {
                        builder.addHeader("Authorization", token);
                    }
                }
                builder.method(original.method(), original.body());

                return chain.proceed(builder.build());
            }).build();

            if (retrofit == null) {
                synchronized (Retrofit.class) {
                    Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
                            .baseUrl(Constants.GRABDOI_SERVER_URL)
                            .client(client)
                            .addConverterFactory(GsonConverterFactory.create())
                            .addCallAdapterFactory(RxJavaCallAdapterFactory.create());
                    retrofit = retrofitBuilder.build();
                }
            }
        }
    }
    api = retrofit.create(type);
}

最佳答案

您可以尝试将对静态方法的访问放在拦截器主体之外:

    public RestClient(Class<T> type) {
    if (retrofit != null) {
        return;
    }
    synchronized (OkHttpClient.class) {
        client = new OkHttpClient();
        OkHttpClient.Builder builder = client.newBuilder();
        final String token;
        if (GrabDoiApplication.getInstance().getCurrentCredentials() != null &&
                (token = GrabDoiApplication.getInstance().getCurrentCredentials().getToken()) != null) {
            builder.addInterceptor(chain -> {
                Request.Builder builder = chain.request().newBuilder();
                builder.addHeader("Authorization", token);
                builder.method(original.method(), original.body());
                return chain.proceed(builder.build());
            });
        }
        client = builder.build();

        synchronized (Retrofit.class) {
            Retrofit.Builder retrofitBuilder = new Retrofit.Builder()
                    .baseUrl(Constants.GRABDOI_SERVER_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create());
            retrofit = retrofitBuilder.build();
        }
    }


    api = retrofit.create(type);
}

关于android - 为什么我不能在 Retrofit 中向拦截器请求 OkHttp 添加 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43096025/

相关文章:

c# - System.Net.Http.Formatting 的 PostAsJsonAsync 在 Xamarin PCL 上抛出 System.NotImplementedException

rest - "Right"REST URL 以获取所有资源中的所有资源?

java - Retrofit2 将正文作为 Json

android - 即使具有公共(public)访问权限也无法访问 AWS 上的公共(public) RDS

java - boolean 标志的 JAXB xmlelement 默认值

java - 如何使用 Retrofit 发出请求

java - 调用 OnFailure 并抛出 IOException 但数据已发布

Android:图像围绕中心旋转

Android:使用处理程序和 postDelayed() 发出问题

android - 后退按钮在 Android 谷歌地图中不起作用