Android 当状态代码为400时,如何使用RxJava改装来获取错误消息?
我使用RxJava进行了如下改装:Android 当状态代码为400时,如何使用RxJava改装来获取错误消息?,android,rx-java,retrofit2,Android,Rx Java,Retrofit2,我使用RxJava进行了如下改装: Retrofit retrofit = new Retrofit.Builder() .baseUrl(HttpURL.BASE_URL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create())
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(HttpURL.BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
当请求错误时,例如密码错误,状态代码是400,错误消息将输入errorBoby以获取我,就像{code:1000,message:“password is error”}
但是,gons GsonConverterFactory不会在respone.getErrorBody中使用JSON,因此我更改代码如下
Call Call=ApiManger.get().getLoginApi().login1(登录);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.code()==0){
mLoginView.onLoginSAccess(response.body().getData());
}否则{
试一试{
结果=new Gson().fromJson(response.errorBody().string(),Result.class);
ToastUtils.showShort(result.getMessage());
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
首先需要序列化错误正文字符串
在onNext()中尝试以下操作:
您需要先序列化错误正文字符串 在onNext()中尝试以下操作:
以标准格式接受回复通常是一个更好的主意-
Class Response{
int code;
String message;
Data data; //////now data is the actual data that u need
/////getter setters
}
现在添加一个api方法,如下所示-
@GET("api_name")
Observable<Response> getResponse(Params);
@GET(“api_名称”)
可观察的getResponse(参数);
现在调用
reformation.getResponse(params)
,您将获得可观察的对象,订阅该可观察对象并在onNext
中检查其值,然后实现您的逻辑。因此,在您的情况下(密码错误),数据将为空,但您将有代码和消息。通常最好接受标准格式的响应-
Class Response{
int code;
String message;
Data data; //////now data is the actual data that u need
/////getter setters
}
现在添加一个api方法,如下所示-
@GET("api_name")
Observable<Response> getResponse(Params);
@GET(“api_名称”)
可观察的getResponse(参数);
现在调用
reformation.getResponse(params)
,您将获得可观察的对象,订阅该可观察对象并在onNext
中检查其值,然后实现您的逻辑。因此,在您的情况下(密码错误),数据将为空,但您将有代码和消息。这可以使用Rx完成,下面是如何:
mSubscription.add(mDataManager.login(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (NetworkUtil.isHttpStatusCode(e, 400) || NetworkUtil.isHttpStatusCode(e, 400)) {
ResponseBody body = ((HttpException) e).response().errorBody();
try {
getMvpView().onError(body.string());
} catch (IOException e1) {
Timber.e(e1.getMessage());
} finally {
if (body != null) {
body.close();
}
}
}
}
@Override
public void onNext(User user) {
//TODO Handle onNext
}
}));
}
这可以通过使用Rx实现,以下是如何实现:
mSubscription.add(mDataManager.login(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
if (NetworkUtil.isHttpStatusCode(e, 400) || NetworkUtil.isHttpStatusCode(e, 400)) {
ResponseBody body = ((HttpException) e).response().errorBody();
try {
getMvpView().onError(body.string());
} catch (IOException e1) {
Timber.e(e1.getMessage());
} finally {
if (body != null) {
body.close();
}
}
}
}
@Override
public void onNext(User user) {
//TODO Handle onNext
}
}));
}
我试了一下,我觉得你的答案看起来很棒。我试了一下,我觉得你的答案看起来很棒