无法将Retrofit Response转换为错误自定义对象两次

时间:2016-10-26 14:20:08

标签: android retrofit retrofit2

为什么我无法将Retrofit Response转换为此类的对象两次:

public static class ApiError { //inner class in REST-class
        @SerializedName("error_code")
        private int errorCode;
        @SerializedName("error_description")
        private String message;

        public int errorCode() {
            return errorCode;
        }

        public String message() {
            return message;
        }
    }

转换的交互:

public static ApiError parseError(Response<?> response) {
        Converter<ResponseBody, ApiError> converter =
                retrofit.responseBodyConverter(ApiError.class, new Annotation[0]);

        ApiError error;

        try {
            error = converter.convert(response.errorBody());
        } catch (IOException e) {
            return new ApiError();
        }

        return error;
    }

所以error2对象在其字段errorCodemessage中没有任何内容但是为什么?

REST.ApiError error = REST.parseError(response);
REST.ApiError error2 = REST.parseError(response);

我在文档中没有看到这一点。

1 个答案:

答案 0 :(得分:1)

当您致电response.errorBody()时,您获得ResponseBody个实例,其定义为:

public abstract class ResponseBody implements Closeable

这意味着,当您尝试读取流时(可能使用public final byte[] bytes()方法),您将刷新流。因此关闭,因此无法再次阅读。

<强>解决方案:

Reader获取ResponseBody的实例并将其包装到BufferedStream中:

BufferedReader streams = new BufferedReader(response.errorBody().charStream());

然后你可以随心所欲地在梦中呼叫reset()

streams.reset();