您需要創建自己的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' ...沿着那條線? –