2017-04-20 38 views
0

我有一個基於不同場景返回200,202,4xx的API。當我得到202時,我應該製作相同的API,直到獲得200或4xx。我嘗試使用doOnErrorNext,onError,onNext。我無法破解的難題使用Retrofit2 + RxJava + Jackson重試202狀態碼

Observable<MyPOJO> makeAPI(); 

Observable<MyPOJO> makeAPIImpl(){ 

makeAPI().doOnErrorNext(/*how to I access the error code here*/); 
makeAPI().doOnNext(/*given that 202 is a success code, I expected it to come here, but it goes to Error because of JSON Mapping*/); 

} 

doOnErrorNext - >我能夠再次進行API呼叫,但隨後會發生這種事了

我檢查了多個答案中的所有錯誤情況,我不想對此,但沒有人具體解決這個組合,並且無法將我的用例的其他答案納入其中。

+0

好吧,202是成功的代碼,所以翻新會嘗試解析它,並可能在你的情況下解析失敗與異常。服務器返回202響應不正確的地方嗎? – yosriz

回答

0

我會建議你使用OkHttp並使用攔截器重新提出要求,這些方針的東西(這是從我在科特林應用程序之一,但它應該給你的想法):

inner class ExpiredSessionInterceptor : Interceptor { 

    override fun intercept(chain: Interceptor.Chain): Response { 
     val request = chain.request() 
     val response = chain.proceed(request) 
     if (response.code() == 202) { 
      val newRequest = request.newBuilder().build() 
      return chain.proceed(newRequest) 
     } else { 
      return response; 
     } 
    } 
} 

那麼

val httpClientBuilder = OkHttpClient.Builder() 
httpClientBuilder.addInterceptor(ExpiredSessionInterceptor()) 

val retrofit: Retrofit = Retrofit.Builder() 
     .baseUrl(SERVER_ENDPOINT_URL) 
     .addConverterFactory(GsonConverterFactory.create(gson))    
     .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io())) 
     .client(httpClientBuilder.build()) 
     .build() 
+0

好的,我會檢查一下。謝謝。 –

+0

我試過了。它第一次運作良好。但是第二次沒有出現。有什麼,你認爲是造成這一點。 –

+0

對不起,我不知道。我從我的代碼中調整了這一點,當我從與我通話的服務器收到特定響應時,我會重試一次。你可能需要進入OkHttp代碼來理解爲什麼它只能工作一次。您可能需要創建新的請求,但如果沒有重現的方式很難說出什麼問題。 – Francesc