【发布时间】:2018-11-18 07:02:11
【问题描述】:
我有以下要求:
@POST("devices/link/")
fun linkDevice(
@Body deviceInfo: DeviceInfo
): Single<Response<UserDevice>>
我想实现以下目标:
如果请求成功,获取 DeviceInfo 并根据状态代码向分析报告事件
如果请求失败,获取异常,转换并重新抛出。
所以,代码是:
fun linkDevice(): Single<UserDevice> {
val deviceInfo = deviceUtil.getDeviceInfo()
return devicesService
.linkDevice(deviceInfo)
.onErrorResumeNext { e ->
val transformedException = transformRequestException(e) { httpException ->
return@transformRequestException when (httpException.code()) {
409 -> DeviceAlreadyLinkedException()
else -> null
}
}
Single.error(transformedException)
}
.flatMap { response ->
if (response.isSuccessful) {
val userDevice = response.body()
userDevice?.let {
userPreferences.setDeviceId(it.id)
}
when (response.code()) {
200 -> {
// TODO: Analytics
}
201 -> {
// TODO: Analytics
}
}
Single.just(userDevice)
} else {
throw ApiException()
}
}
}
/**
* Transform exception that came from request
* By default, handles only network and HTTP 401 exceptions, but can contain custom logic, passed with specialTransformer
*/
fun transformRequestException(
e: Throwable,
specialTransformer: ((httpException: HttpException) -> Exception?)? = null
): Exception {
return if (e is HttpException) {
if (e.code() == 401) {
NotAuthenticatedException()
} else {
specialTransformer?.invoke(e) ?: ApiException()
}
} else {
NetworkException()
}
}
但是这段代码不起作用,如果我使用 Response 对象进行操作,它将仅适用于我的改造服务中的Single<UserDevice>。
但是,Single<UserDevice> 我无法获得 2XX 代码。
那么,如何实现期望的行为呢?
【问题讨论】:
-
需要区分 200 和 201 吗?
-
@Blackbelt 200 表示现有设备已重新链接,201 表示新设备已链接。我需要将其传递给分析。
-
Single<Result<UserDevice>>怎么样? -
@EpicPandaForce
Result表示错误 == false 即使出现错误:(
标签: android kotlin retrofit2 rx-java2