在服务器的特定错误的Retrofit on Retrofit中使用已更改的baseUrl重试http请求

时间:2017-03-16 10:30:24

标签: android retrofit2

在应用程序中,我们使用Retrofit2和Rx与我们的服务器进行通信。当我得到特定的http错误代码时,我想在Retrofit中更改baseUrl 。我找到了example to change Request header on error with Interceptor. 我希望在Retrofit中有这个逻辑,因为它是我们的多个请求通过的单个地方。 其他使用Rx retryWhen()的解决方案很难使用,因为我们在项目应用程序的不同位置有很多请求。

3 个答案:

答案 0 :(得分:0)

如果您使用RxJava,最简单的方法是使用运算符onErrorResumeNext链接请求

例如,您有whiteApi基本网址XXXX和黑色改造blackApi使用不同的baseUrl(在whiteApi失败时调用):

whiteApi.getCat().onErrorResumeNext( err-> blackApi.getCat() ) ...

如果blackApi失败,您也可以使用.onErrorReturn()链接请求并模拟回复。

答案 1 :(得分:0)

简单地说,在第一个案例失败时,使用新的基本网址创建另一个改造实例,并在完成工作后清除它。

答案 2 :(得分:0)

也许你可以为你的服务创建一个类包装器:

public class ServiceGenerator {  
    public static String apiBaseUrl = "http://base.url/api";
    private static Retrofit retrofit;

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .addConverterFactory(relevantConverter)
                    .baseUrl(apiBaseUrl);

    private static OkHttpClient.Builder httpClient =
            new OkHttpClient.Builder();


    private ServiceGenerator() {
    }

    public static void changeApiBaseUrl(String newApiBaseUrl) {
        apiBaseUrl = newApiBaseUrl;

        builder = new Retrofit.Builder()
                        .addConverterFactory(relevantConverter)
                        .baseUrl(apiBaseUrl);
    }

    public static <S> S createService(Class<S> serviceClass, String baseUrl) {
        builder.client(httpClient);

    return builder.build().create(serviceClass);
}
    // your methods
    // ...
}

当你得到你的http错误代码时,调用changeApiBaseUrl()。

希望这有帮助。

抱歉我的英文。