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