android - retrofit2 rxjava 2 - 出现错误时如何访问响应体
问题描述
我将 Retrofit 与 Rxjava 一起用于对服务器的请求。
我的服务器返回包含数据的定义的 json 格式和定义的消息。
服务器返回http响应。如果服务器返回成功代码(200)就可以了。
但我想,如果服务器返回其他代码,我会管理该响应的主体。
例如:
服务器返回 401,我想读取服务器显示消息的响应正文。
但是当服务器其他代码时,改造调用 onError 方法,我不能使用响应体。
如何解决这个问题?
这是我的方法
'''
private void login(String username , String password){
view.setLoading();
source.loginUser(username, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<Response<LoginResult>>() {
@Override
public void onSubscribe(Disposable d) {
disposable.add(d);
}
@Override
public void onSuccess(Response<LoginResult> loginResult) {
if (loginResult.isSuccessful()){
}
else
new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());
}
@Override
public void onError(Throwable e) {
if there is a problem
}
});
'''
这是我改造的接口方法
@POST("...")
Single<Response<LoginResult>> loginUser(@Query("username") String username, @Query("password") String password);
解决方案
根据这里的信息,由于您已经在使用Response<LoginResult>
,您应该能够将 Throwable 转换为 HttpException,然后提取响应的正文。
在科特林:
if (e is HttpException) {
val errorBody = (e as HttpException).response().errorBody()
}
在 Java 中:
if (e instanceof HttpException) {
HttpException error = (HttpException)e;
String errorBody = error.response().errorBody().string();
}
使用您的 Java 代码的完整示例:
import retrofit2.HttpException
private void login(String username , String password){
view.setLoading();
source.loginUser(username, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<Response<LoginResult>>() {
@Override
public void onSubscribe(Disposable d) {
disposable.add(d);
}
@Override
public void onSuccess(Response<LoginResult> loginResult) {
if (loginResult.isSuccessful()){
// Handle success
} else {
// Handle login failure
new AlertConfiguration(view.getViewActivity()).showMessage(loginResult.body().getMessage());
}
}
@Override
public void onError(Throwable e) {
// Get the error response:
if (e instanceof HttpException) {
HttpException error = (HttpException)e;
String errorBody = error.response().errorBody().string();
// Then parse the errorBody and extract the values you need
}
}
});
推荐阅读
- azure - 将 Microsoft Dynamics 导出到 Azure SQL 超大规模
- python - PYTHON + KIVYMD / KIVY | 滚动视图仅在屏幕的一半上,但在导航抽屉中使用时正常工作
- javascript - 为什么此功能不在每个画布上粘贴一个图像?
- html - 尝试重新创建此模板,但菜单无法正常工作?
- java - 云中的 Spring Boot API 不如本地快
- java - 如何使用 Mockito 模拟局部变量?
- json - 无法访问键中包含连字符或数字的 JSON 属性 - Rollup 和 TypeScript
- amazon-ec2 - 如何在 ALB 设置下获取 Cognito 刷新令牌?
- reactjs - React App.js 在进行更改时不会更新,但其他组件会更新
- python - 为什么程序未运行时访问被拒绝?