使用Retrofit2 + RxJava + Jackson重试202状态代码

时间:2017-04-20 03:25:15

标签: android jackson rx-java retrofit2

我有一个基于不同场景返回200,202,4xx的API。当我得到202时,我应该制作相同的API,直到我得到200或4xx。我尝试使用doOnErrorNext,onError,onNext。我无法解决问题

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 - &gt;我能够再次进行API调用,但是对于我不想要的所有错误情况都会发生这种情况

我已经检查了多个这方面的答案,但是没有人专门解决了这个组合,我无法将其他答案纳入我的用例。

1 个答案:

答案 0 :(得分:0)

我建议您使用OkHttp并使用拦截器重试您的请求,这些内容(这是我在Kotlin的一个应用程序,但它应该给你的想法):

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()