2017-09-19 31 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") 
      } 
     })