设计模式之Retrofit接口

5
我在Retrofit接口创建方面遇到了困难。我希望能以通用的方式实例化API接口,并在传递令牌时更新相应的实例。目前,当我更新令牌时,必须再次调用createService()方法来获取使用令牌生成接口的新实例...
有人问过类似的问题,但从未得到答案,请参见此处
public class RetrofitCreator {

    private static String TAG = "RetrofitCreator";
    private static String WSSE = null;
    private static String AmzToken = null;
    static HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    private static AmazonAPI amazonAPI = null;
    private static VanishAPI cobaltAPI = null;

    //static OkHttpClient client = new OkHttpClient.Builder().build();
    static OkHttpClient.Builder httpClient = new OkHttpClient.Builder().addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY));

    private static Retrofit.Builder builder =
            new Retrofit.Builder();

    public static <S> S createService(Class<S> serviceClass) {

        S mAPI = null;
            if(serviceClass.getSimpleName().equals("VanishAPI")){
                if(VanishAPI==null){
                    VanishAPI = (VanishAPI) createVanishAPI(serviceClass);
                }
                mAPI = (S) VanishAPI;
            }else if(serviceClass.getSimpleName().equals("AmazonAPI")){
                if(amazonAPI==null){
                    amazonAPI = (AmazonAPI) createAmazonAPI(serviceClass);
                }
                mAPI = (S) amazonAPI;
            }
        return mAPI;
    }


    public static void setWSSE(String WSSE) {
        RetrofitCreator.WSSE = WSSE;
        vanishAPI = createVanishAPI(VanishAPI.class);
    }

    public static void setAmzToken(String token) {
        RetrofitCreator.AmzToken = token;
        amazonAPI = createAmazonAPI(AmazonAPI.class);
    }

private static <S> S createAmazonAPI(Class<S> serviceClass){
    httpClient = getUnsafeOkHttpClient();
    builder = new Retrofit.Builder()
            .baseUrl(Constants.URL_AMAZON)
            .addConverterFactory(JacksonConverterFactory.create());

    if (AmzToken != null) {
        Log.w(TAG, "WSSE not null!");
        Interceptor interceptorSecure = new Interceptor() {
            @Override
            public Response intercept(Interceptor.Chain chain) throws IOException {
                Request original = chain.request();

                // Request customization: add request headers
                Request.Builder requestBuilder = original.newBuilder()
                        .header("Cache-Control", "no-cache")
                        .header("Accept", "application/json")
                        .header("Authorization", "Bearer " + AmzToken)
                        .method(original.method(), original.body());

                Request request = requestBuilder.build();
                return chain.proceed(request);
            }
        };
        httpClient.addInterceptor(interceptorSecure);
    }

    OkHttpClient client = httpClient.build();
    Retrofit retrofit = builder.client(client).build();
    return retrofit.create(serviceClass);
}

(...)
}

为了在每个活动中获得它,我使用以下方法:
amazonApi = RetrofitCreator.createService(AmazonAPI.class);
1个回答

2
让你的拦截器看起来像这样:
public class TokenInterceptor implements Interceptor {

    private String token;

    public String getToken() {
        return token;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .header("Cache-Control", "no-cache")
                    .header("Accept", "application/json")
                    .method(original.method(), original.body());
            if (getToken() != null) {
                requestBuilder.header("Authorization", "Bearer " + AmzToken);
            }
            Request request = requestBuilder.build();
            return chain.proceed(request);
    }

    public void setToken(String token) {
        this.token = token;
    }
}

将其添加到您的OkHttp客户端并保留对此拦截器的引用。 现在,您无需在每次令牌更改后调用createService()。只需通过interceptor.setToken()更改拦截器中的令牌即可。


我能否像他在这里所做的那样,将您的类作为内部静态类?https://github.com/kaaes/spotify-web-api-android/blob/master/spotify-api/src/main/java/kaaes/spotify/webapi/android/SpotifyApi.java - user5988366
请将令牌的setter方法设置到外部类中。 - Ilya Tretyakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接