Apache HttpComponents的替代品?

Dmi*_*tri 49 java http jetty httpclient

所以,我得出结论,Apache HttpComponents 4是我遇到过的最烦人的API之一.看起来他们应该很简单的事情就是花费数百行代码(我仍然不确定资源是否正确清理).

另外它要我做的事情如下:

List<NameValuePair> qparams = new ArrayList<NameValuePair>();
qparams.add(new BasicNameValuePair("q", "httpclient"));
qparams.add(new BasicNameValuePair("btnG", "Google Search"));
qparams.add(new BasicNameValuePair("aq", "f"));
qparams.add(new BasicNameValuePair("oq", null));
URI uri = URIUtils.createURI("http", "www.google.com", -1, "/search", 
  URLEncodedUtils.format(qparams, "UTF-8"), null);
Run Code Online (Sandbox Code Playgroud)

哪个,只是......不.我知道它是Java,我们并不是整个简洁的事情,但这有点多了.更不用说罐子高达700KB.

无论如何,足够的咆哮,我想看看人们与其他HTTP客户端库有什么样的体验?

我所知道的是:Jetty,hotpotatoAsyncHttpClient.

这是为了服务器端使用,我最感兴趣的是许多并发获取和大文件传输的性能.

有什么建议?

PS我知道古老的HttpClient 3.1仍然存在,但我想使用支持的东西.

更新

@oleg:这是文档的建议:

    HttpClient httpclient = new DefaultHttpClient();
    try {
        HttpGet httpget = new HttpGet("http://www.apache.org/");
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            try {
                instream.read();
            } catch (IOException ex) {
                throw ex;
            } catch (RuntimeException ex) {
                httpget.abort();
                throw ex;
            } finally {
                try { instream.close(); } catch (Exception ignore) {}
            }
        }
    } finally {
        httpclient.getConnectionManager().shutdown();
    }
Run Code Online (Sandbox Code Playgroud)

使用时消耗实体内容时仍会出现意外错误ThreadSafeClientConnManager.我确定这是我的错,但在这一点上我真的不想弄明白.

嘿,我并不是要贬低任何人在这里的工作,但是自从4.0问世以来我一直在努力使用HttpComponents并且它不适合我.

ok2*_*k2c 20

HttpClient API的复杂性简单地反映了其问题域的复杂性.与流行的误解相反,HTTP是一种相当复杂的协议.作为低级传输库,HC 4.0 API主要针对性能和灵活性而非简单性进行了优化.遗憾的是你无法弄清楚,但也是如此.欢迎您使用最适合您需求的图书馆.我个人非常喜欢Jetty HttpClient.这是一个很好的选择,可能会更好地为您服务.

  • HTTP很复杂,但Apache的HttpComponents库*被过度设计,并且包含很多复杂性,这对协议操作来说并不重要.它客观上有一个非常糟糕的API. (19认同)
  • "HttpClient API的复杂性只是反映了其问题域的复杂性."如果HC 4.0是完美的那么这将是一个好点,但事实并非如此.它存在许多问题,我认为缺乏方向导致它陷入今天的混乱局面.我认为Alex B是正确的,他说客观上API很糟糕,而且可能会更好*.本来可以的. (5认同)
  • 我同意你(+1)和OP.功能和灵活性是必要的,但也应该有一套简化过程的外观方法.像`public static InputStream httpGetAsStream(String baseUrl,Map <String,Object> parameters)这样的方法 (4认同)
  • @Alex B:HttpComponents正在各种不同的应用程序中使用,从简单的URL提取程序到具有不同的,通常相互冲突的要求的复杂传输和Web爬行程序.对某些人来说似乎不重要的东西对其他人来说绝对必不可少.HttpClient必须处理几十个自定义参数和特定于上下文的策略和对象.因此,灵活性必须先于简单性.对于那些无法绕过HttpClient API的人来说,有一个流畅的外观API:http://hc.apache.org/httpcomponents-client-dev/fluent-hc/index.html (2认同)
  • @SeanPatrickFloyd`应该有一组façade方法.确实有*这样一组方法:[Apache HttpComponents Fluent API](https://hc.apache.org/httpcomponents-client-ga/tutorial/html /fluent.html).(正如oleg在上面的评论中指出的那样) (2认同)

Vah*_*yan 16

对于简单的用例,您可以使用 HttpClient Fluent API.查看教程.

该模块基于流畅的界面概念为HttpClient提供了易于使用的Facade API.Fluent facade API仅公开HttpClient的最基本功能,并且适用于不需要HttpClient完全灵活性的简单用例.例如,流畅的外观API使用户不必处理连接管理和资源释放

    // Execute a GET with timeout settings and return response content as String.
 Request.Get("http://somehost/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute().returnContent().asString();
Run Code Online (Sandbox Code Playgroud)

Maven神器.

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.2.5</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

  • 更新:现在有很多更好的选择.OkHttp和Retrofit是精美的库,简洁而功能完美,适用于大多数现代应用. (3认同)

Dmi*_*tri 6

回答我自己的问题,因为它因某种原因而复活了.

我最后写了几个简单的包装器java.net.HttpURLConnection,似乎自上次我认真考虑它以来已经走了很长的路.

Apache HttpComponents很棒,但对于简单的任务来说可能有点过分.此外,至少在我的场景中,HUC明显更快(主要是单线程,在重负载下没有进行任何测试).

  • 由于 HttpURLConnection 实例共享一个静态 JRE 范围的连接池,因此创建 HttpURLConnection 实例的成本要低得多。默认情况下 HttpClient 总是创建一个新的连接池,因此启动和预热较慢。可以通过为新请求重用 HttpClient 的相同实例来解决这个问题。这种方法被 HttpClient 的 fluent Facade 使用,例如:http://hc.apache.org/httpcomponents-client-dev/fluent-hc/index.html。在所有其他情况下,我认为 HttpClient 应该更快 (2认同)
  • 也许我做错了什么,这不是严格的基准测试.我总是使用一个HttpClient实例.刚刚运行了一个快速测试:从localhost获取,非常小的文档(150字节)x 5000次使用HttpClient(4.1)大约需要10秒,使用HUC需要2秒.这实际上不仅仅是学术性的,我的主要用例是对同一台机器上的服务进行大量小型查找. (2认同)
  • 我只能给你我(有偏见的)观点.任何持续2秒的HTTP性能测试都不具代表性.需要运行基准测试几分钟才能获得更多或更少的可靠数字.以下是我们在内部使用的基准测试和一些结果:http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore.与HUC和其他客户相比,HttpClient 4.x性能似乎相当不错. (2认同)
  • 当然.就像我说的那样,它绝不是一个全面的基准.然后,在_my_特殊情况下,您的基准测试未涵盖,有明显的差异.我不会从中推广(当然不具代表性),但它确实影响了我在我的场景中使用什么的决定. (2认同)