Apache HttpComponents的替代品?

所以,我得出的结论是,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,而我们并没有涉及到整个简单的事情,但是这有点多。 更不用说jar子高达700KB。

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

我知道的是: Jetty , Hotpotato和AsyncHttpClient 。

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

任何build议?

PS我知道古老的HttpClient 3.1仍然存在,但我想使用一些支持。

更新

@oleg:这是文档build议的内容:

  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,这对我来说并不合适。

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

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

本模块基于stream畅的界面概念为HttpClient提供了一个易于使用的Facade API。 stream利的Facade API只公开了HttpClient的最基本的function,并被简单的用例所包容,不需要HttpClient的全部灵活性。 例如,stream畅的Facade API可以让用户不必处理连接pipe理和资源释放

  // 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> 

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

我最后写了一些简单的java.net.HttpURLConnection包装,似乎是从上次我认真考虑以来很长的路要走。

Apache HttpComponents很棒,但是对于简单的任务来说可能会过度。 另外,至less在我的情况下,HUC明显更快(主要是单线程,没有在重负载下进行任何testing)。

Google HTTP客户端

另一个库是用于Java的Google HTTP客户端库 。

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

您可以使用Netty或Apache Mina,尽pipe它们的级别很低,而且我不确定最终的代码是否较less。

jsoup

jsoup是一个用来parsingHTML文件的库。 它确实进行HTTP调用来检索网页的源代码。

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

我是来自JAX-RS的客户端API(在2.0中进行了标准化)以及Jersey的实现。 它支持asynchronous和连接器,以便它可以由Apache HttpComponents,普通的HttpUrlConnection,Jetty或灰熊支持。

这里有一些很好的例子,包括以下内容。

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

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

HTMLUnit可以工作,但对我来说似乎对Javascript有限的支持。 我已经能够使用它的基本网页了。

你可以看看Restlet的客户端function。 例如,上面的层可以被Apache HttpComponents或Java的Net API支持。