Apache HttpComponents的替代品?

时间:2011-03-24 05:23: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);

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

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

我所知道的是:JettyhotpotatoAsyncHttpClient

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

有什么建议吗?

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

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

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

9 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:16)

对于简单用例,您可以使用HttpClient Fluent API。请参阅tutorials

  

该模块基于流畅的界面概念为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();

Maven神器。

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>fluent-hc</artifactId>
    <version>4.2.5</version>
</dependency>

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:4)

Google HTTP客户端

另一个图书馆是Google HTTP Client Library for Java

  

由Google编写,该库是一个灵活,高效且功能强大的Java客户端库,用于通过HTTP访问Web上的任何资源。它具有可插入的HTTP传输抽象,允许使用任何低级库,例如java.net.HttpURLConnection,Apache HTTP Client或Google App Engine上的URL Fetch。它还具有高效的JSON和XML数据模型,用于HTTP响应和请求内容的解析和序列化。 JSON和XML库也是完全可插拔的,包括支持Jackson和Android的JSON GSON库。

答案 4 :(得分:3)

您可以使用NettyApache Mina,虽然它们的级别非常低,但我不确定您的代码是否会更简洁。

答案 5 :(得分:3)

jsoup

jsoup是一个用于解析HTML文件的库。它确实进行HTTP调用以检索网页的源代码。

Document doc = Jsoup.connect("http://en.wikipedia.org/").get();

答案 6 :(得分:3)

我是来自JAX-RS(在2.0中标准化)和泽西岛特别实施的客户端API的粉丝。它支持异步并具有connectors,因此它可以由Apache HttpComponents,普通HttpUrlConnection,Jetty或Grizzly支持。

有一些很好的使用示例here,包括以下内容。

client.target(REST_SERVICE_URL)
      .path("/{bookId}")
      .resolveTemplate("bookId", bookId)
      .request()
      .get(Book.class);

答案 7 :(得分:1)

HTTPUnit有一个很棒的接口(不需要太多代码),但是它的最新版本提交了重复的请求。

HTMLUnit会起作用,但对我来说似乎对Javascript的支持有限。我有 之所以能够将它用于基本网页。

答案 8 :(得分:1)

您可以查看Restlet的客户端功能。例如,Apache HttpComponents或Java的Net API可以支持它。