首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否有可能在HttpAsynClient中从HttpClient-5.x中止http请求[GET,POST等]?

在HttpAsyncClient中,可以通过设置一个标志位来中止HTTP请求。具体步骤如下:

  1. 创建一个自定义的HttpClientBuilder对象,并覆写其createHttpAsyncClient方法。在该方法中,创建一个CloseableHttpAsyncClient实例,并覆写其execute方法。
  2. 在execute方法中,将传入的HttpUriRequest对象封装成一个AbortableHttpRequest对象,然后调用execute方法执行请求。
  3. 在AbortableHttpRequest对象的execute方法中,判断一个标志位(例如isAborted),如果标志位为true,则直接返回空结果;否则,调用父类的execute方法执行请求。
  4. 当需要中止请求时,将标志位设置为true。

以下是一个示例代码:

代码语言:txt
复制
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
import org.apache.http.impl.nio.client.HttpAsyncClients;
import org.apache.http.nio.client.methods.AbortableHttpRequest;
import org.apache.http.nio.protocol.BasicAsyncResponseConsumer;
import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
import org.apache.http.protocol.HttpContext;

public class CustomHttpAsyncClient {

    public CloseableHttpAsyncClient createHttpAsyncClient() {
        return HttpAsyncClients.custom()
                .setHttpAsyncRequester(new CustomHttpAsyncRequester())
                .build();
    }

    private class CustomHttpAsyncRequester extends DefaultHttpAsyncRequester {

        @Override
        public <T> Future<T> execute(
                final HttpAsyncRequestProducer requestProducer,
                final HttpAsyncResponseConsumer<T> responseConsumer,
                final HttpContext context,
                final FutureCallback<T> callback) {

            return super.execute(
                    new AbortableHttpRequestProducer(requestProducer),
                    responseConsumer,
                    context,
                    callback);
        }
    }

    private class AbortableHttpRequestProducer implements HttpAsyncRequestProducer {

        private final HttpAsyncRequestProducer requestProducer;
        private volatile boolean isAborted = false;

        public AbortableHttpRequestProducer(HttpAsyncRequestProducer requestProducer) {
            this.requestProducer = requestProducer;
        }

        @Override
        public HttpUriRequest generateRequest() throws IOException, HttpException {
            return requestProducer.generateRequest();
        }

        @Override
        public void produceContent(ContentEncoder encoder, IOControl ioControl) throws IOException {
            requestProducer.produceContent(encoder, ioControl);
        }

        @Override
        public void requestCompleted(HttpContext context) {
            requestProducer.requestCompleted(context);
        }

        @Override
        public boolean isRepeatable() {
            return requestProducer.isRepeatable();
        }

        @Override
        public void resetRequest() throws IOException {
            requestProducer.resetRequest();
        }

        @Override
        public void close() throws IOException {
            requestProducer.close();
        }

        @Override
        public void failed(Exception ex) {
            requestProducer.failed(ex);
        }

        @Override
        public void close(CloseMode closeMode) {
            isAborted = true;
            requestProducer.close(closeMode);
        }
    }
}

使用示例:

代码语言:txt
复制
CloseableHttpAsyncClient httpclient = new CustomHttpAsyncClient().createHttpAsyncClient();
httpclient.start();

HttpUriRequest request = new HttpGet("http://www.example.com");

Future<HttpResponse> future = httpclient.execute(request, new BasicAsyncResponseConsumer(), null);

// 在需要中止请求时
((AbortableHttpRequest) request).abort();

HttpResponse response = future.get();

这样,当调用((AbortableHttpRequest) request).abort()时,就可以中止HTTP请求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • HTTPClient和CloseableHttpClient

    使用HttpClient发送请求的一般步骤 (1) 创建HttpClient对象。 (2)创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。 (3) 如果需要发送请求参数,可调用HttpGet同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,可调用setEntity(HttpEntity entity)方法来设置请求参数。 (4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。 (5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。 (6) 释放连接。无论执行方法是否成功,都必须释放连接

    01

    Android开发笔记(六十三)HTTP访问的通信方式

    输入输出流在java中很常用,从文件读写到内存读写到网络通信都会用到。在之前的《Android开发笔记(三十三)文本文件和图片文件的读写》中,我们学习了文件流FileOutputStream和FileInputStream,以及缓存流BufferedOutputStream和BufferedInputStream。这些输入输出流都继承自InputStream和OutputStream,下面是它们的常用方法: InputStream的常用方法 available : 获取输入流的大小 read : 从输入流中读取数据 close : 关闭输入流 OutputStream的常用方法 write : 往输出流写数据 flush : 刷新输出流 close : 关闭输出流 java在进行http访问操作时,发送数据使用OutputStream,接收数据使用InputStream。如果采用HttpURLConnection,InputStream对象可从HttpURLConnection的getInputStream方法获得;如果采用HttpClient,InputStream对象可从HttpEntity的getContent方法获得。下面是http访问时与InputStream有关的加工操作: 1、从InputStream对象中读取字符串。首先把输入流的数据读到字节流ByteArrayOutputStream,然后调用字节流的toByteArray方法得到字节数组,最后调用String的构造函数根据指定编码从字节数组构造返回字符串; 2、从InputStream对象中读取图像。调用BitmapFactory的decodeStream方法即可返回Bitmap图像数据。 3、从InputStream对象中解压gzip压缩数据。引入GZIPInputStream从输入流构造解压流,然后再从解压流中读取数据。

    05
    领券