2017-03-02 64 views
0

我有rxjava(observable)+ retrofit2在一起向我的應用程序發出http請求。我爲應用程序創建一次OkHttpClient,並且不想重新創建它。 我已經在可觀察的級別上實現了重試邏輯 - 使用過濾器,重試時一起。 我想要什麼 - 如果請求從服務器端完成錯誤,我想重試它,併發送附加頭。 所以,我不明白我怎樣才能修改可重複的內部重試什麼時候,以及如何從攔截器級別獲得關於observable的知識。 任何關於可能的方法的想法和/或知識?修改請求/重試之間

+0

我不認爲你的建議可以工作。一方面,okhttpclient和Retrofit實例是不可變的。這意味着您不能在客戶端構建完成後從客戶端添加和刪除攔截器。一旦設置完成,您也無法更改改造實例使用的客戶端。 – JohnWowUs

+0

你可以編寫一個攔截器,在服務器發生故障的情況下,這個攔截器將執行與新頭相同的請求。這對你有用嗎? – LordRaydenMK

+0

將不同版本的請求想成是完全不同的「可觀察」是否有意義?然後,你可以像'Observable.concat(simpleRequest,requestWithExtraHeader).take(1)'這樣的東西 - 如果'simpleRequest'未能產生一個項目,它只會訂閱'requestWithExtraHeader' ...沿着那條線? –

回答

0

您需要創建自己的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標誌。