我正在使用Retrofit
和RxJava
发出这样的网络请求:
我如何声明请求:
@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
,您必须为其创建一个新的自定义异常类。