Android 当状态代码为400时,如何使用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())

我使用RxJava进行了如下改装:

 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
                            }
                        }));
            }

我试了一下,我觉得你的答案看起来很棒。我试了一下,我觉得你的答案看起来很棒