适用于 Java 的异步 HTTP 客户端

2022-09-02 05:34:12

作为Java世界中的一个相对新手,我发现许多令人沮丧的事情都是迟钝的,而这些事情在许多其他框架中都是相对微不足道的。一个主要示例是异步 http 请求的简单解决方案。鉴于一个似乎不存在,最好的方法是什么?使用阻塞类型lib(如httpclient或内置的java http)创建我自己的线程,或者我应该使用较新的非阻塞io java东西 - 对于应该简单的东西来说,它似乎特别复杂。

我正在寻找的是一些从开发人员的角度来看易于使用的东西 - 类似于AS3中的URLLoader - 你只需创建一个URLRequest - 附加一堆事件处理程序来处理完成,错误,进度等,并调用一个方法来触发它。

如果您不熟悉AS3中的URLLoader,它非常容易,看起来像这样:

private void getURL(String url)
{
    URLLoader loader = new URLLoader();
    loader.addEventListener(Event.Complete, completeHandler);
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

    URLRequest request = new URLRequest(url);

    // fire it off - this is asynchronous so we handle
    // completion with event handlers
    loader.load(request);
}

private void completeHandler(Event event)
{
    URLLoader loader = (URLLoader)event.target;
    Object results = loader.data;

    // process results
}

private void httpStatusHandler(Event event)
{
    // check status code
}

private void ioErrorHandler(Event event)
{
    // handle errors
}

答案 1

对于 Java 中的异步 HTTP 客户端,您有多种选择

  1. Java 8:使用异步 http 客户端,以前称为 ning http 客户端库。
  2. Java 11 及更高版本:JDK 现在附带 java.net.http。HttpClient是完全异步的。
  3. Square's OkHttpClient.支持同步阻止和带回调的异步调用。在安卓上很受欢迎。

答案 2

Apache Commons HttpClient的4.0版本(现在在HttpComponents/HttpCore中)也支持Java的NIO(非阻塞IO)。我认为这是你最好的选择。


推荐