2017-04-20 39 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