当前位置: 首页 > 知识库问答 >
问题:

如何在不读取okhttp3中的响应正文的情况下关闭响应正文

盖斌
2023-03-14
    null
try (Response response = client.newCall(request).execute()) {
    assertThat(response.code(), is(200))
    // do nothing with the response body
}

但是,当与HTTP1建立连接时,ResponseBody::Close最后调用http1ExchangeCodec.FixedLengthSource::Close

http1ExchangeCodeC.FixedLengthSource::Close

override fun close() {
    if (closed) return

    if (bytesRemaining != 0L &&
        !discard(ExchangeCodec.DISCARD_STREAM_TIMEOUT_MILLIS, MILLISECONDS)) {
    connection.noNewExchanges() // Unread bytes remain on the stream.
    responseBodyComplete()
    }

    closed = true
}

然后,discard方法读取所有响应体源,如下所示。

fun Source.discard(timeout: Int, timeUnit: TimeUnit): Boolean = try {
    this.skipAll(timeout, timeUnit)
} catch (_: IOException) {
    false
}

@Throws(IOException::class)
fun Source.skipAll(duration: Int, timeUnit: TimeUnit): Boolean {
    val nowNs = System.nanoTime()
    val originalDurationNs = if (timeout().hasDeadline()) {
        timeout().deadlineNanoTime() - nowNs
    } else {
        Long.MAX_VALUE
    }
    timeout().deadlineNanoTime(nowNs + minOf(originalDurationNs, timeUnit.toNanos(duration.toLong())))
    return try {
        val skipBuffer = Buffer()
        while (read(skipBuffer, 8192) != -1L) {
            skipBuffer.clear()
        }
        true // Success! The source has been exhausted.
    } catch (_: InterruptedIOException) {
        false // We ran out of time before exhausting the source.
    } finally {
        if (originalDurationNs == Long.MAX_VALUE) {
            timeout().clearDeadline()
        } else {
            timeout().deadlineNanoTime(nowNs + originalDurationNs)
        }
    }
}

共有1个答案

胡安怡
2023-03-14
java prettyprint-override">try (Response response = client.newCall(request).execute()) {
    assertThat(response.code(), is(200))
    
    response.body()
        .source()
        .timeout()
        .deadlineNanoTime(0);
    // close without reading remaining bytes
}
 类似资料:
  • 为了记录请求和响应,我添加了一个LoggingRequestInterceptor,它实现了ClientHTTPPrequestinterceptor。。。 响应主体是一个流,如果我将其读取到我的拦截器中,TestRestTemplate将无法将其反序列化到我的对象模型中。换句话说,当我调用testRestTemplate时。获取…我将始终获取空对象(即使我看到对象我的响应)。 要解决RestTe

  • 我正在使用reverfit2调用一个微服务,它在PUT方法上返回一个200和一个空的响应体。但是,reverfit 2似乎无法处理这一点,并且在“enqueue”中转到onFailure分支 @override public void onFailure(Call Call,Throwable t){ 以下是日志: 有人知道这是什么原因造成的吗?因为请求被成功地提供了(见上文)。

  • 问题内容: 在Java中,当HTTP结果为404范围时,此代码将引发异常: 就我而言,我碰巧知道内容是404,但无论如何我还是想阅读响应的内容。 (在我的实际情况下,响应代码为403,但是响应的主体说明了拒绝的原因,我希望向用户显示该原因。) 如何访问响应正文? 问题答案: 这是错误报告(关闭,无法修复,不是错误)。 他们的建议是这样编码:

  • 我正在基于Tomcat servlet和NIO创建服务。输入时有大的XML请求(约100 MB),通过HTML POST方法发送。我只想流前8千磅,然后立即发送响应到客户端。 当我尝试发送小请求(内容中只有几行)时,套接字工作正常。 2016-02-01 10:44:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.net.NioEndp

  • 问题内容: 我已经在go中编写了http客户端包装,我需要对其进行彻底的测试。我正在使用包装器中的ioutil.ReadAll阅读响应正文。我在弄清楚如何才能借助httptest强制从响应正文读取失败时遇到了一些麻烦。 我假设我可以像这样设置一个假服务器: 我假设我需要修改ResposeWriter。现在,有什么办法让我修改responseWriter,从而迫使包装器中的ioutil.ReadAl

  • 我有一个使用gRPC的服务器,在反应客户端上,我正在使用grpcwebagent的grpc网络,我一直在尝试将我的客户端连接到服务器,但不断得到错误代码2,消息为:响应关闭,没有标头。其他人遇到过这个问题吗?我目前正在使用grpc-web的不可能-eng实现。