Jersey-client和Apache HTTP Client如何比较?

首先,我不是想在这里开始一场火焰战争。 我知道泽西足够好,但很less使用httpclient。

jersey-client和Apache的httpclient有什么不同之处? 在哪个领域比另一个更好? 有没有比较好的图表? 哪一个更好的文件(比如2048 MB)?

非常感谢您的意见!

这两件事大概不应该直接比较。 Jersey是一个REST客户端,具有完整的JAX-RS实现,整洁的stream畅API和强大的filter堆栈。 Apache Http Client是一个HTTP客户端,非常适用于pipe理超时,复杂代理路由和连接轮询等低级细节。 他们在协议栈的不同层次上行事。 当您使用Jersey时,总是会涉及到某种HTTP客户端后端。 泽西没有明确的后端,将使用HttpUrlConnection作为默认的后端。

泽西与HttpUrlConnection后端示例:

 Client client = Client.create(); WebResource webResource = client.resource("http://localhost:8080/path"); ClientResponse response = webResource.accept("application/json") .get(ClientResponse.class); 

泽西与Apache Http客户端后端示例:

 HttpClient apacheClient = HttpClientBuilder.create().build(); Client client = new Client(new ApacheHttpClient4Handler(apacheClient, new BasicCookieStore(), true)); WebResource webResource = client.resource("http://localhost:8080/path"); ClientResponse response = webResource.accept("application/json") .get(ClientResponse.class); 

最后一个例子中请注意Handler的用法。 这是泽西集成和利用各种后端的关键集成抽象。 第一个例子使用URLConnectionClientHandler

说到性能和function,将Apache Http Client与Jersey比较是没有意义的。 有人可能想比较不同的泽西后端,因为泽西本身只是一个包装的API。 我想根据我自己的经验来突出HttpUrlConnection和Apache Http Client之间的一些关键差异:

HttpURLConnection的

  • 没有外部依赖是必要的。 这在embedded式或移动平台上可能非常有价值。
  • 无处不在的文件
  • devise不佳的API。 基于HttpUrlConnection的实现难以维护和扩展。
  • 许多function都是通过JVM属性进行configuration的,其中一些function可能在运行时不可重新configuration。
  • 在某些情况下,处理超时是毫无希望的。 您可能最终会为不同的超时设置10个不同的JVM属性,并且在某些情况下仍会永久挂起您的连接。
  • 由于姜饼是Android 推荐的 http客户端API。

Apache Http客户端

  • 对于3.X版本,其性能有点类似于HttpUrlConnection 。 4.1版包含很多性能增强function,并且比对应的function更好
  • 非常善于pipe理连接和数据读取超时
  • 它的devise遵循开放/closures原则 ,所以您可以自定义几乎任何HTTP处理部分。 示例:redirect策略,重试策略,自定义Cookie存储,请求/响应拦截器等。
  • 通过可定制的路由构build器为复杂的多代理path提供丰富的代理支持
  • 具有开箱即用的每个路由连接池。 如果使用SSL / TLS,特别是涉及到硬件PKCS#11令牌,这可能会带来很好的性能优势。 HttpUrlConnection也有一个内部池,但是你没有工具来定制什么或什么时候池,没有监视工具来检查池的状态。
  • function详细的日志

请记住,如果你有一个合适的com.sun.jersey.api.client.ClientHandler实现,也可以使用Jersey的其他后端(例如非阻塞客户端)。