android - 如何在状态代码为 400 时使用 Retrofit 和 RxJava 来获取错误消息?

标签 android rx-java retrofit2

<分区>

我用 Retrofit 和 RxJava 是这样的:

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(HttpURL.BASE_URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build();

当请求错误时,比如密码错误,状态码是400,错误消息会int errorBoby 来得到我,就像{code: 1000, message: "password is wrong"}。

但是,gons GsonConverterFactory 不会在 respone.getErrorBody 中使用 fromJson,所以我像这样更改我的代码

 Call<Result<User>> call = ApiManger.get().getLoginApi().login1(login);
 call.enqueue(new Callback<Result<User>>() {
            @Override
            public void onResponse(Call<Result<User>> call, Response<Result<User>> response) {
                if (response.code() == 0) {
                    mLoginView.onLoginSuccess(response.body().getData());
                } else {
                    try {
                        Result result = new Gson().fromJson(response.errorBody().string(),Result.class);
                        ToastUtils.showShort(result.getMessage());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<Result<User>> call, Throwable t) {

            }
        });
        

所以它不能与Rxjava一起使用,我该如何改变它?

最佳答案

这可以使用 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
                            }
                        }));
            }

网络工具

public class NetworkUtil {

    /**
     * Returns true if the Throwable is an instance of RetrofitError with an
     * http status code equals to the given one.
     */
    public static boolean isHttpStatusCode(Throwable throwable, int statusCode) {
        return throwable instanceof HttpException
                && ((HttpException) throwable).code() == statusCode;
    }
}

关于android - 如何在状态代码为 400 时使用 Retrofit 和 RxJava 来获取错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44095132/

相关文章:

android - android-如何通过使用LiveData和RxJava处理错误?

安卓 : Unable to upload multipart Image file using Retrofit 2. 0.0 测试版 2

android - 开发人员错误验证 Gmail 登录 Android - 异常 10

android finish() 方法不会从内存中清除应用程序

java - 有没有办法使用多次尝试和一次捕获?

kotlin - 基于 bool 值的Rx Java调用Api

java - 如何使用 RxJava2 将多个单词组合成一个句子?

android - 失败时如何获取retrofit request的body?

android - 如何从Retrofit、RxJava、Android中的所有请求发出多个请求和响应

php - 上传图片到服务器php-my-sql(android)