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

首先,我不是想在这里发动一场火焰战争。我对泽西岛非常了解,但几乎没有使用过httpclient。

Jersey-client和Apache的httpclient之间的主要区别是什么?在哪些方面,一个比另一个更好?在某个地方有好的比较图表吗?哪一个对较大的文件(例如2048 MB)性能更好?

非常感谢您的评论!


答案 1

这两件事可能不应该直接比较。Jersey 是一个 REST 客户端,具有完整的 JAX-RS 实现、简洁流畅的 API 和强大的过滤器堆栈。Apache Http Client是一个HTTP客户端,非常适合管理超时,复杂的代理路由和连接轮询等低级细节。它们在协议栈的不同级别上起作用。当您使用泽西岛时,总会涉及某种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);

请注意上一个示例中处理程序的用法。这是泽西岛合并和利用各种后端的关键集成抽象。第一个示例使用深层底层。URLConnectionClientHandler

说到性能和功能,将Apache Http Client与Jersey进行比较是没有意义的。人们可能想在这里比较不同的泽西岛后端,因为泽西岛本身只是一个包装API。我想根据我自己的经验强调HttpUrlConnection和Apache Http Client之间的一些关键区别:

HttpUrlConnection

  • 不需要外部依赖项。这在嵌入式或移动平台上可能非常有价值。
  • 到处都有非常完善的记录
  • API 设计不佳。基于-的实现很难维护和扩展。HttpUrlConnection
  • 许多功能部件都是通过 JVM 属性配置的,其中一些功能在运行时可能是不可重新配置的。
  • 在某些情况下,在处理超时时方面毫无希望。您可能最终会为不同的超时设置 10 个不同的 JVM 属性,并且在某些情况下仍然会让连接永远挂起。
  • 由于Gingerbread是Android推荐的http客户端API。

Apache Http Client

  • 对于3.X版本,它的性能与.版本4.1包含许多性能功能,并且性能比同类版本更好HttpUrlConnection
  • 非常擅长管理连接和数据读取超时
  • 它的设计遵循开放/封闭原则,因此您可以使用自己的实现自定义HTTP处理的几乎任何部分。示例:重定向策略、重试策略、自定义 Cookie 存储、请求/响应的拦截器等。
  • 通过可自定义的路由生成器为复杂的多代理路径提供丰富的代理支持
  • 具有开箱即用的每路由连接池。如果使用 SSL/TLS,这可能会带来良好的性能优势,尤其是涉及硬件 PKCS#11 令牌。 还具有内部池化,但您没有工具来自定义池的内容或时间,也没有监视功能来检查池状态。HttpUrlConnection
  • 功能详细日志记录

请记住,如果您有适当的实现,也可以将其他后端(例如,对于非阻塞客户端)与 Jersey 一起使用。com.sun.jersey.api.client.ClientHandler


答案 2

推荐