rx java retrofit 2错误处理

Jen*_*yza 7 android rx-java retrofit

我正在使用改装2和rx java

情况:应用程序发送一些请求,然后我得到json格式的响应,自动转换为用户dto,然后在rx java的onNext方法中我收到用户列表.如果我从服务器收到这样的消息怎么办:{"error":"无法获取用户列表"}

如何通过改造2和rx来处理这种情况?

      Subscription subscriptionBranches = model.getRepoBranches(owner, name)
                    .map(branchesMapper)
                    .subscribe(new Observer<List<Branch>>() {
                        @Override
                        public void onCompleted() {
                            ;
                        }

                        @Override
                        public void onError(Throwable e) {
                            if (e instanceof retrofit.HttpException) {
                                HttpException exception = (HttpException) e;
                            }
                            showError(e);
                        }

                        @Override
                        public void onNext(List<Branch> list) {
                            branchList = list;
                            view.showBranches(list);
                        }
                    });

            addSubscription(subscriptionBranches);
.....
    @Override
    public Observable<List<RepositoryDTO>> getRepoList(String name) {
        return apiInterface
                .getRepositories(name)
                .compose(applySchedulers());
    }
Run Code Online (Sandbox Code Playgroud)

Fre*_*red 18

根据服务器响应,您可能会或可能不会进入您的onError功能.如果服务器返回非2XX http状态代码,您将进入该onError方法.另一方面,如果您获得2XX http状态代码,则输入onNext.

我假设你可以处理这onNext一点,我会解释你如何能够做到这一点onError.重要的是要意识到有很多方法可以做到这一点,这只是一个使用okhttp 3改进2 beta4的例子.

因此,retrofit2表示每个非2XX http响应HttpException在使用时都是rxjava.您已经在代码中使用了它:

if (e instanceof retrofit.HttpException) {
   HttpException exception = (HttpException) e;
}
Run Code Online (Sandbox Code Playgroud)

现在你要做的就是获得响应的主体.这可以通过Response response = exception.response()HttpException那里打电话来实现.通过响应,获取错误正文非常简单.你打电话response.errorBody().然后,您可以将主体转换为java对象,或者只是将其作为字符串进行访问.

由于您有一个json错误主体作为示例,以下是如何将响应主体转换为java对象:

new GsonConverterFactory().responseBodyConverter(type,
      new Annotation[0]).convert(response.errorBody());
Run Code Online (Sandbox Code Playgroud)

where type表示错误的java对象的类.

所以把它们放在一起,在你的onError方法上你可以写下这样的东西:

if (e instanceof retrofit.HttpException) {
   HttpException exception = (HttpException) e;
   Response response = exception.response();
   Converter<ResponseBody, MyError> converter = new GsonConverterFactory()
       .responseBodyConverter(MyError.class, Annotation[0]);
   MyError error = converter.convert(response.errorBody());
}
Run Code Online (Sandbox Code Playgroud)

MyError 是一个模型,表示您在问题中的错误json.