2015-03-31 91 views
0

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

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

通知“+1” maxAllowedSize后:它要求有一个证明,原来的网页/资源,其实是太大了。 如果使用最后一个字节,则抛出异常;否则该页面已处理。

我试图在HTTPClient 4.3.3中实现同样的事情,但我找不到从服务器只下载定义数量字节的方法......这在我的应用程序中至关重要。 你能帮我吗?先谢谢你。

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

+0

你能链接到该方法的javadoc吗? – 2015-03-31 15:31:37

+0

完成,感谢您对我的问题的关注。 – CptWasp 2015-03-31 17:07:56

回答

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(); 
} 
+0

谢谢你的回答;我看到你使用1KB块来使用流:目的是什么? – CptWasp 2015-04-02 09:12:30

+0

@CptWasp不是真的。根据首选的性能特征,tmp缓冲区可能稍大或略小,但通常不应该一次读取一个字节(尽管HC通过保留内部会话缓冲区来优化一个字节的读取) – oleg 2015-04-02 09:45:06

+0

10直接使用byte [] b = EntityUtils.toByteArray(entity);',没有块? – CptWasp 2015-04-02 10:03:05