您需要创建自己的Interceptor
实现,您可以在其中设置标题逻辑。类似于
public class FallbackInterceptor implements Interceptor {
static String header1Key = "key1";
static String extraHeaderKey = "key2";
String header1, extraHeader;
boolean useextraheader = false;
public FallbackInterceptor(string header1, string extraheader) {
this.header1 = header1;
this.extraheader = extraheader;
}
public void setUseExtraHeader(boolean useextraheader) {
this.userextraheader = useextraheader;
}
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
// Add request headers
Request.Builder requestBuilder = original.newBuilder().header(header1Key, header1);
if (useExtraHeader) {
requestBuilder = requestBuilder.header(extraHeaderKey, extraHeader)
}
Request newRequest = requestBuilder.method(original.method(), original.body())
.build();
// Return the response
return chain.proceed(request);
}
}
将此添加到okhttpclient并让您的改造实例使用它。然后,您可以在重试逻辑中操作extraheader标志。
我不认为你的建议可以工作。一方面,okhttpclient和Retrofit实例是不可变的。这意味着您不能在客户端构建完成后从客户端添加和删除拦截器。一旦设置完成,您也无法更改改造实例使用的客户端。 – JohnWowUs
你可以编写一个拦截器,在服务器发生故障的情况下,这个拦截器将执行与新头相同的请求。这对你有用吗? – LordRaydenMK
将不同版本的请求想成是完全不同的“可观察”是否有意义?然后,你可以像'Observable.concat(simpleRequest,requestWithExtraHeader).take(1)'这样的东西 - 如果'simpleRequest'未能产生一个项目,它只会订阅'requestWithExtraHeader' ...沿着那条线? –