2017-04-20 2 views
0

다른 시나리오에 따라 200, 202, 4xx를 반환하는 API가 있습니다. 내가 202를 얻었을 때, 나는 200이나 4xx를 얻을 때까지 같은 API를 만들어야한다. 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 호출을 할 수 있었다 그러나 그것은 내가 여러 답변을 확인했다

내가 원하는 해달라고 모든 오류 시나리오에 일어날 것 이것에 관해서는, 그러나 아무도이 조합을 구체적으로 해결하지 못했고 나의 유스 케이스에 다른 대답을 포함시킬 수 없습니다.

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; 
     } 
    } 
} 

:

+0

글쎄, 202는 성공 코드이므로 개조하면 구문 분석을 시도하고 아마도 예외가 발생하여 구문 분석에 실패합니다. 응답이 올바르지 않은 경우 서버에서 202를 반환합니까? – yosriz

답변

0

나는 당신이이 라인을 따라 뭔가를 (이 코 틀린 내 애플 리케이션 중 하나이지만, 그것은 당신에게 아이디어를 줄 것이다) 요청을 다시 시도 OkHttp를 사용하고 인터셉터를 사용하는 것이 좋습니다 것입니다

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