如何将错误响应解析为 Throwable?



我正在使用RetrofitRxJava发出这样的网络请求:

我如何声明请求:

@POST("auth/profile/edit/")
fun updateProfile(@Body body: ProfileUpdateBody): Single<Response<Void>>

我怎么称呼:

api.updateProfile(**some data**)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {
Log.d("----------", "Subscribed!")
}
.doOnSuccess {
if(it.isSuccessful)
Log.d("----------", "Success!")
else
Log.d("----------", "Not Successfull!")
}
.doOnError {
Log.d("----------", "Error Happened!")
}
.subscribe({
}, {
})

为了便于阅读,已删除某些代码。即使我收到带有 401 或 400 状态的响应,探测也会doOnSuccess被调用。不应该在这里叫doOnError吗?我很困惑。

结果,我的日志行为显示"不成功"消息。如何确保在收到包含 401 或 400 状态的响应时调用doOnErro

或者我可以解析传入的响应以Throwable并调用doOnError()函数吗?

更改改造 API 调用以返回Completable

@POST("auth/profile/edit/")
fun updateProfile(@Body body: ProfileUpdateBody): Completable

然后通过doOnComplete处理"成功案例":

api.updateProfile(**some data**)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {
Log.d("----------", "Subscribed!")
}
.doOnComplete {
Log.d("----------", "Success!")
}
.doOnError {
Log.d("----------", "Error Happened!")
}
.subscribe({  }, {  })

真正的问题是,为什么要在请求失败时抛出和异常?

此处遵循正确的过程,doOnSuccess按预期调用,因为请求返回了响应,而没有遇到引发的异常。无论请求的响应是否成功。

您应该相应地处理响应的状态,而不是为其引发任意异常:

api.updateProfile(**some data**)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(response -> {
if (response.isSuccessful()) {
// handle success
} else {
// handle failure
}
}, t -> {
// handle thrown error
yourErrorHandlerMethod(t);
})

你得到的响应是正确的,响应显示在doOnSuccess中,因为你击中API被成功击中,无论响应代码是什么。 doOnError 当实际调用失败时API例如中间的网络掉线或某些服务器端问题。

或者我可以解析 Throwable 的传入响应并调用 doOnError(( 函数吗?

你不能这样做,你可以在doOnSuccess中处理响应,作为

try {
api.updateProfile(**some data**)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe {
Log.d("----------", "Subscribed!")
}
.doOnSuccess {
if(it.isSuccessful) // responce code = 200/201
Log.d("----------", "Success!")
else if (it.responseCode == 400 ){
Log.d("----------", "Not Found!")
// Call a method that handles this according to your requirement.
PageNotFoundHandler();
// OPTIONAL throw new UserException();
}
else if (it.responseCode == 401 ){
Log.d("----------", "Not Authorised!")
// Call a method that handles this according to your requirement.
TokenExpiredHandler(); //OR
UnAuthorizedAccessHandler();
// OPTIONAL throw new UserException();
}
else {
Log.d("----------", "Some another Error!")
// Call a method that handles this according to your requirement.
// OPTIONAL throw new UserException();
}
}
.doOnError {
Log.d("----------", "Error Happened!")
}
.subscribe({
}, {
})
} catch 
{
ErrorHandler();
}

或者我可以解析 Throwable 的传入响应并调用 doOnError(( 函数吗?

正如你提到你想要一个可抛掷的东西,你可以通过使用try-catch块来实现它。

只需抛出一个自定义EXCEPTION,您必须为其创建一个新的自定义异常类。

最新更新