2017-09-19 39 views
0

我在庫項目中使用RxJava進行翻新。一切工作正常,當我請求數據時,我會得到預期的結果。Rxjava翻新爲用戶解析api錯誤

@GET(Routes.ME) 
fun getUserObservable(): Observable<User> 

從API類:

fun getUser(): Observable<User> { 
    return usersService.getUserObservable() 
} 

從中使用這個庫的主要項目中,我得到了用戶這樣的:

api.getUser().observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()) 
      .subscribe({ user -> 
         println("Get user success : $user") 
        }, { error -> 
         println("Get user error : $error") 
        }) 

所有工作正常,但如果API發生錯誤,則API發送給我們,例如:

{reason: "the reason of the error", details: "some details", type:"the type error"} 

我想要的是明確地提供這個錯誤到前面得到這個錯誤,因爲直到現在,當我從錯誤Observable中得到錯誤時,前面無法解析我想要構建的這個錯誤。所以我的目的是從我的庫中解析這個錯誤,用提供的API json構建一個錯誤POJO,並在前端出現錯誤時發送它。如果錯誤不是來自API,那麼前面應該會得到正常的錯誤。

+0

你爲什麼不使用rxKotlin的訂閱? – ste9206

+0

你是對的,我可以,這將是下一步,但首先需要解決我的問題 – ejay

回答

0

您將需要實例改造將異常映射到錯誤響應。這裏是一個例子:

class Error(
     var reason: String = "", 
     var details: String = "", 
     var type: String = "" 
) 

api.getUser() 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe({ user -> 
      println("Get user success : $user") 
     }, { throwable -> 
      if (throwable is HttpException) { 
       val converter: Converter<ResponseBody, Error> = retrofit.responseBodyConverter(Error::class.java, emptyArray()) 
       val error = converter.convert(throwable.response().errorBody()) 
       println("Get user error : ${error.reason}") 
      } else { 
       println("Get user error : $throwable") 
      } 
     })