在改造成功回调中,我正在使用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
提前致谢。
答案 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}使用它}。