Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以流的形式获取httpclient响应_Java_Apache_Apache Httpclient 4.x - Fatal编程技术网

Java 如何以流的形式获取httpclient响应

Java 如何以流的形式获取httpclient响应,java,apache,apache-httpclient-4.x,Java,Apache,Apache Httpclient 4.x,我正在使用httpclient 4.5.5 我想得到高达1 gb的大文件作为响应。但是看起来 CloseableHttpResponse-response=httpClient.execute(httpGet); HttpEntity=response.getEntity() 这将返回整个响应,因此在内存中保留整个响应是不好的。有没有办法以流形式获取响应?使用HttpURLConnection而不是httpClient final HttpURLConnection conn = (HttpUR

我正在使用httpclient 4.5.5 我想得到高达1 gb的大文件作为响应。但是看起来

CloseableHttpResponse-response=httpClient.execute(httpGet);
HttpEntity=response.getEntity()


这将返回整个响应,因此在内存中保留整个响应是不好的。有没有办法以流形式获取响应?

使用
HttpURLConnection
而不是
httpClient

final HttpURLConnection conn = (HttpURLConnection)url.openConnection();
final int bufferSize = 1024 * 1024;
conn.setChunkedStreamingMode(bufferSize);
final OutputStream out = conn.getOutputStream();

您需要Apache异步客户端

HttpAsyncClient是Apache HttpClient的异步版本。ApacheHttpClient在内存中构建整个响应,而使用HttpAsyncClient,您可以定义一个处理程序(使用者)在接收数据时处理响应

https://hc.apache.org/httpcomponents-asyncclient-4.1.x/index.html
下面是他们官方示例代码中的一个示例

package org.apache.http.examples.nio.client;

import java.io.IOException;
import java.nio.CharBuffer;
import java.util.concurrent.Future;

import org.apache.http.HttpResponse;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.nio.IOControl;
import org.apache.http.nio.client.methods.AsyncCharConsumer;
import org.apache.http.nio.client.methods.HttpAsyncMethods;
import org.apache.http.protocol.HttpContext;

/**
 * This example demonstrates an asynchronous HTTP request / response exchange with
 * a full content streaming.
 */
public class AsyncClientHttpExchangeStreaming {

    public static void main(final String[] args) throws Exception {
        CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
        try {
            httpclient.start();
            Future<Boolean> future = httpclient.execute(
                    HttpAsyncMethods.createGet("http://httpbin.org/"),
                    new MyResponseConsumer(), null);
            Boolean result = future.get();
            if (result != null && result.booleanValue()) {
                System.out.println("Request successfully executed");
            } else {
                System.out.println("Request failed");
            }
            System.out.println("Shutting down");
        } finally {
            httpclient.close();
        }
        System.out.println("Done");
    }

    static class MyResponseConsumer extends AsyncCharConsumer<Boolean> {

        @Override
        protected void onResponseReceived(final HttpResponse response) {
        }

        @Override
        protected void onCharReceived(final CharBuffer buf, final IOControl ioctrl) throws IOException {
            while (buf.hasRemaining()) {
                System.out.print(buf.get());
            }
        }

        @Override
        protected void releaseResources() {
        }

        @Override
        protected Boolean buildResult(final HttpContext context) {
            return Boolean.TRUE;
        }

    }

}
package org.apache.http.examples.nio.client;
导入java.io.IOException;
导入java.nio.CharBuffer;
导入java.util.concurrent.Future;
导入org.apache.http.HttpResponse;
导入org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
导入org.apache.http.impl.nio.client.httpacyncClients;
导入org.apache.http.nio.IOControl;
导入org.apache.http.nio.client.methods.AsyncCharConsumer;
导入org.apache.http.nio.client.methods.httpacynchmethods;
导入org.apache.http.protocol.HttpContext;
/**
*此示例演示了一个异步HTTP请求/响应交换
*全内容流媒体。
*/
公共类AsyncClientHttpExchange流{
公共静态void main(最终字符串[]args)引发异常{
CloseableHttpAsyncClient httpclient=HttpAsyncClients.createDefault();
试一试{
httpclient.start();
Future=httpclient.execute(
HttpAsyncMethods.createGet(“http://httpbin.org/"),
新MyResponseConsumer(),null);
布尔结果=future.get();
if(result!=null&&result.booleanValue()){
System.out.println(“请求成功执行”);
}否则{
System.out.println(“请求失败”);
}
System.out.println(“关闭”);
}最后{
httpclient.close();
}
系统输出打印项次(“完成”);
}
静态类MyResponseConsumer扩展了AsyncCharConsumer{
@凌驾
收到受保护的无效响应(最终HttpResponse响应){
}
@凌驾
受保护的void onCharReceived(final CharBuffer buf,final IOControl ioctrl)引发IOException{
while(buf.haslaining()){
System.out.print(buf.get());
}
}
@凌驾
受保护的无效释放资源(){
}
@凌驾
受保护的布尔构建结果(最终HttpContext上下文){
返回Boolean.TRUE;
}
}
}

自4.0版起的Apache HttpClient(以及Apache HttpAsyncClient)支持传入和传出HTTP消息的完整内容流。使用
HttpEntity
访问下划线内容输入流

CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://myhost/tons-of-stuff");
try (CloseableHttpResponse response1 = client.execute(httpGet)) {
    final HttpEntity entity = response1.getEntity();
    if (entity != null) {
        try (InputStream inputStream = entity.getContent()) {
            // do something useful with the stream
        }
    }
}

仅仅发布到概述页面的链接并不是一个答案。外部链接很快就会断开,所以答案对读者来说毫无价值。因此,你应该在答案中包含相关的(代码)部分!