从 HTTPClient 3.1 迁移到 4.3.3,Method.getResponseBody(int)

Migration from HTTPClient 3.1 to 4.3.3, Method.getResponseBody(int)

我正在将使用 HTTPClient 3.1 的旧软件更新为使用 HTTPClient 4.3.3。 我注意到在旧代码中有一个特定的要求:当获取远程 page/resource 时,客户端能够验证维度,如果内容太大而无需下载完整资源则生成异常。 这是通过以下方式完成的:

int status = client.executeMethod(method);
...
byte[] responseBody= method.getResponseBody(maxAllowedSize+1);

请注意 maxAllowedSize 后的“+1”:要求证明原始 page/resource 实际上太大了。 如果使用了最后一个字节,则抛出异常;否则页面已处理。

我试图在 HTTPClient 4.3.3 中实现相同的功能,但我找不到从服务器仅下载定义数量的字节的方法...这对我的应用程序至关重要。 你能帮助我吗?提前谢谢你。

旧 getResponseBody(int) 方法的 Javadoc:https://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpMethodBase.html#getResponseBody(int)

通常应该直接从内容流中使用内容,而不是将其缓冲在中间缓冲区中,但这与 4.3 API 大致相同:

CloseableHttpClient client = HttpClients.custom()
        .build();
try (CloseableHttpResponse response = client.execute(new HttpGet("/"))) {
    HttpEntity entity = response.getEntity();
    long expectedLen = entity.getContentLength();
    if (expectedLen != -1 && expectedLen > MAX_LIMIT) {
        throw new IOException("Size matters!!!!");
    }
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    InputStream inputStream = entity.getContent();
    byte[] tmp = new byte[1024];
    int chunk, total = 0;
    while ((chunk = inputStream.read(tmp)) != -1) {
        buffer.write(tmp, 0, chunk);
        total += chunk;
        if (total > MAX_LIMIT) {
            throw new IOException("Size matters!!!!");
        }
    }
    byte[] stuff = buffer.toByteArray();
}