如何转换okhttp3 ResponseBody多种类型?

时间:2017-08-02 22:07:46

标签: android retrofit2 rx-java2

我正在使用TMDb API并返回两个不同的HttpException errorBody类型。

一个是正确的ApiStatus模型,它包含json中的状态代码和消息。 其他是json中的错误数组。

所以我需要检查这两种类型并将它们转换为正确的错误模型。(ApiStatus和Error pojos)

以下是我尝试处理两种情况的方法:

public abstract class DisposableSingleObserverWrapper<T> extends DisposableSingleObserver<T> {
    public abstract void onSuccess(T t);

    public abstract void onFail(Throwable e);

    @Override
    public void onError(@NonNull Throwable e) {
        if (e instanceof HttpException) {
            ResponseBody body = ((HttpException) e).response().errorBody();

            try {
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http:/fakeapi/")
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

                //New status code handling in tmdb api
                Converter<ResponseBody, ApiStatus> errorConverter2 = retrofit.responseBodyConverter(ApiStatus.class, new Annotation[0]);
                ApiStatus apiStatus = errorConverter2.convert(body);
                if (apiStatus != null && !TextUtils.isEmpty(apiStatus.getStatusMessage())) {
                    onFail(new Throwable(apiStatus.getStatusMessage()));
                }
                else {
                    //Old case of handling status codes in tmdb api
                    Converter<ResponseBody, Error> errorConverter = retrofit.responseBodyConverter(Error.class, new Annotation[0]);
                    Error error = errorConverter.convert(body);
                    if (error != null & error.getErrorList()!=null && error.getErrorList().size()>0) {
                        onFail(new Throwable(error.getErrorList().get(0)));
                    }
                    else{
                        onFail(new Throwable(((HttpException) e).response().code() + " - " + ((HttpException) e).response().message()));
                    }
                }

            } catch (IOException ioException) {
                onFail(new Throwable(((HttpException) e).response().code() + " - " + ((HttpException) e).response().message()));
            }
        } else {
            onFail(e);
        }
    }

    public class Error {
        @SerializedName("errors")
        public ArrayList<String> errorList;

        public ArrayList<String> getErrorList() {
            return errorList;
        }
    }
}

这项工作并没有按预期工作,因为ResponseBody在第一次转换试用中被消耗,而在第二种情况下它没有数据。我的问题是如何克隆ResponseBody或我应该采取什么样的方法来处理这种情况?

0 个答案:

没有答案