改装 - 使用后的 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)

这不会消耗缓冲区。