【问题标题】:Rxjava retrofit parse api error for user用户的 Rxjava 改造解析 api 错误
【发布时间】:2018-02-27 22:21:57
【问题描述】:

我在一个库项目中使用 RxJava 和改造。一切正常,我在请求数据时得到了预期的结果。

@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构建一个Error POJO,当前端出现错误时发送。如果错误不是来自 API,那么前面应该会得到正常的错误。

【问题讨论】:

  • 为什么不用 rxKotlin 的 subscribeBy 呢?
  • 你说得对,我可以,这将是下一步,但需要先解决我的问题

标签: android kotlin retrofit rx-java


【解决方案1】:

您将需要 retrofit 实例来将异常映射到错误响应。这是一个例子:

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")
            }
        })

【讨论】:

  • 我真的很想看到一个可以通过 ConverterFactory 或 OkHttp 拦截器执行此操作的实现,而不是在每个 api 调用上处理这个。通过创建一个扩展 Throwable 的 Error 类。知道怎么做吗?
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2015-03-06
  • 2016-03-02
  • 2016-05-23
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多