尝试从1.9.0中的retrofit.client.Response读取响应时,InputStream关闭了错误

时间:2017-05-09 15:52:47

标签: java android retrofit

在改造成功回调中,我正在使用response.getBody().in()获取流并使用以下代码将其转换为String。

        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = in.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }
        return result.toString("UTF-8");

我在in.read(buffer)中得到IOException(已关闭)。当改造日志记录设置为RestAdapter.LogLevel.FULL时,上面的代码工作正常,但设置为RestAdapter.LogLevel.NONE时崩溃。

为了进一步调试,我尝试通过response.getBody().length()打印响应长度。如果RestAdapter.LogLevel.FULL,我得到-1为RestAdapter.LogLevel.NONE和实际长度(2000+)。

注意:我不想使用retrofit的模型解析,因为我想构建自己的模型。

我正在使用改装1.9.0

提前致谢。

1 个答案:

答案 0 :(得分:0)

我对Retrofit 1.x没有直接经验。但是,通常使用Retrofit,从响应中取出body或errorBody将返回相关主体的内容并关闭连接。

这就是为什么你不能在实际尝试使用之前偷看身体并记录它。即使成功响应,当您下次尝试访问正文数据时也会导致IOException。

我没有充分的理由在这里涉及REST级别的日志记录级别。我们可能不得不看到更多代码来解决这个问题。我通过HTTP客户端进行日志记录(这是它在Retrofit 2中的工作方式)。但是,返回-1表示连接已关闭,与之关联的所有流也已关闭。

(我们知道从Retrofit 1.x改变的一个原因是它们删除了REST级别的日志记录。显然,它总是有点狡猾,并不一定反映响应的实际状态。)< / p>

Retrofit 2(至少)有一个@Streaming注释,您可以在接口方法声明中应用该注释,您可以使用它来获取原始八位字节而不反序列化为对象。

如果您绝对需要继续使用Retrofit 1.x并且无法理清REST级别日志记录,我很确定您可以将HTTP记录器拦截器链接到OkHTTP客户端,并让Retrofit通过{{1}使用它}。