android 在Retrofit中选择性地将承载令牌添加到报头

jtw3ybtb  于 2023-02-27  发布在  Android
关注(0)|答案(2)|浏览(162)

我想知道是否有任何选项来启用/禁用头拦截器的基础上的标志或注解在翻新。因为有几个路径在我的API不需要一个令牌,我需要跳过添加令牌到那些API调用。
目前,我有一个简单的拦截器,它将添加一个头到所有的请求,从我的应用程序

//builder is of type OkHttpClient.Builder
builder.addInterceptor(chain -> {
    Request request = chain.request().newBuilder().
    addHeader("authorization", "Bearer foofootoken").build();

    return chain.proceed(request);
});
gzszwxb4

gzszwxb41#

我已经研究了这一段时间前,我没有找到任何解决方案提供的改造开箱即用,但你可以很容易地实现一个变通办法由自己。
只需使用您选择的标题对请求进行注解,例如“NoAuth:true”并在拦截器中检查此报头:

builder.addInterceptor(chain -> {
    String noAuthHeader = chain.request().header("NoAuth");
    Request.Builder request = chain.request().newBuilder();
    if(noAuthHeader == null || !noAuthHeader.equals("true")){
        request.addHeader("authorization", "Bearer foofootoken").build();
    }

    return chain.proceed(request.build());
});
wz3gfoph

wz3gfoph2#

这就是我如何处理与标题和没有令牌翻新

public class ApiClient {

private final Retrofit retrofit;

public ApiClient(String token) {
    if (token.equals("null")){
        retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BaseURL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }else{
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
                    @NonNull
                    @Override
                    public Response intercept(@NonNull Chain chain) throws IOException {
                        Request newRequest = chain.request().newBuilder()
                                .addHeader("Authorization", "Bearer " + token)
                                .build();
                        return chain.proceed(newRequest);
                    }
                }).connectTimeout(600, TimeUnit.SECONDS)
                .readTimeout(600, TimeUnit.SECONDS)
                .build();
        
        retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl(Constants.BaseURL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

}

public ApiInterface getApi() {
    return retrofit.create(ApiInterface.class);
}}

然后你可以这样打电话

Call<GetGalleryResponse> call = new ApiClient(new SharePrefManager(this).getAuthToken()).getApi().get_gallery_info("11");

或者不带标头,可以这样调用

Call<GetGalleryResponse> call = new ApiClient("null").getApi().get_gallery_info("11");

相关问题