【问题标题】:Migration from HTTPClient 3.1 to 4.3.3, Method.getResponseBody(int)从 HTTPClient 3.1 迁移到 4.3.3,Method.getResponseBody(int)
【发布时间】:2015-03-31 15:24:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你能链接到那个方法的javadoc吗?
  • 完成,感谢您对我的问题感兴趣。

标签: java apache-httpclient-4.x apache-commons-httpclient


【解决方案1】:

通常应该直接从内容流中使用内容,而不是将其缓冲在中间缓冲区中,但这与 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();
}

【讨论】:

  • 感谢您的回答;我看到您使用 1KB 块来消费流:目的是什么?
  • @CptWasp 不是真的。 tmp 缓冲区可能会更大或更小,具体取决于首选的性能特征,但通常不应一次读取一个字节(尽管 HC 通过保留内部会话缓冲区来优化一个字节读取)
  • 不分块直接使用byte[] b = EntityUtils.toByteArray(entity);怎么样?
  • @CptWasp EntityUtils#toByteArray 不对内容长度强制设置任何最大上限(除了一个字节的最大物理容量[])
  • 对不起@oleg 我不清楚;我的意思是,我可以使用你的建议long expectedLen = entity.getContentLength(); if (expectedLen != -1 && expectedLen > MAX_LIMIT) { throw new IOException("Size matters!!!!"); } 然后EntityUtils.toByteArray(entity); 并忘记块?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2021-01-15
  • 2020-05-27
  • 1970-01-01
  • 2021-03-20
  • 2021-08-31
  • 2020-09-09
相关资源
最近更新 更多