改装 - 使用后的 charStream 和 string() 清洁主体
retrofit - charStream and string() cleaning body after use
我什么也没找到,但是在我调用response.body.charStream()
或string()
之后,下一行会收到一个空体。我可以看到它也在进行评估。
为什么会发生这种情况以及如何处理?
我有一个 Authenticator 使用 charStream 来处理一个请求,但我需要获取响应 errorbody 来处理我的 UseCase 中的另一个请求。
好吧,我在 okhttp docs 中找到了这个:
响应体只能被消费一次
所以,我决定克隆缓冲区。我在 HttpLoggingInterceptor 中找到了一些示例,一个由 square 自己完成的 class。现在,它的工作。
private fun cloneBuffer(body:ResponseBody):String{
val source = body.source()
source.request(Long.MAX_VALUE)
val buffer = source.buffer
return buffer.clone().readString(Charset.forName("UTF-8"))
}
我发现这个 issue 是关于同一件事的。还有更好的方法!
val responseBody = response.peekBody(Long.MAX_VALUE)
这不会消耗缓冲区。
我什么也没找到,但是在我调用response.body.charStream()
或string()
之后,下一行会收到一个空体。我可以看到它也在进行评估。
为什么会发生这种情况以及如何处理?
我有一个 Authenticator 使用 charStream 来处理一个请求,但我需要获取响应 errorbody 来处理我的 UseCase 中的另一个请求。
好吧,我在 okhttp docs 中找到了这个: 响应体只能被消费一次
所以,我决定克隆缓冲区。我在 HttpLoggingInterceptor 中找到了一些示例,一个由 square 自己完成的 class。现在,它的工作。
private fun cloneBuffer(body:ResponseBody):String{
val source = body.source()
source.request(Long.MAX_VALUE)
val buffer = source.buffer
return buffer.clone().readString(Charset.forName("UTF-8"))
}
我发现这个 issue 是关于同一件事的。还有更好的方法!
val responseBody = response.peekBody(Long.MAX_VALUE)
这不会消耗缓冲区。