代码之家  ›  专栏  ›  技术社区  ›  carlspring

Jersey客户端和Apache HTTP客户端的比较如何?

  •  56
  • carlspring  · 技术社区  · 11 年前

    首先,我不是想在这里挑起一场火焰战争。我非常了解Jersey,但几乎没有使用过httpclient。

    jersey客户端和Apache的http客户端之间的主要区别是什么?在哪些方面一个比另一个好?有好的比较图表吗?对于较大的文件(比如2048 MB),哪一个性能更好?

    非常感谢您的评论!

    1 回复  |  直到 11 年前
        1
  •  95
  •   Jk1    10 年前

    这两件事可能不应该直接比较。Jersey是一个REST客户端,具有完整的JAX-RS实现、简洁流畅的API和强大的过滤器堆栈。Apache Http客户端是一个Http客户端,非常适合管理低级别的细节,如超时、复杂的代理路由和连接轮询。它们作用于协议栈的不同级别。 当您使用Jersey时,总会涉及到某种HTTP客户端后端。如果没有明确的后端,Jersey将使用 HttpUrlConnection 作为默认后端。

    带有HttpUrlConnection后端的Jersey示例:

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

    带有Apache Http客户端后端的Jersey示例:

    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的用法。这是Jersey集成和利用各种后端的关键集成抽象。第一个示例使用 URLConnectionClientHandler 在引擎盖的深处。

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

    HttpUrl连接

    • 不需要任何外部依赖关系。这在嵌入式或移动平台上可能非常有价值。
    • 到处都有非常好的记录
    • API设计不佳。 HttpUrl连接 -基于实现很难维护和扩展。
    • 许多功能是通过JVM财产配置的,其中一些可能在运行时不可重新配置。
    • 在某些情况下,无法处理超时。您可能最终会为不同的超时设置10个不同的JVM财产,但在某些情况下,您的连接仍然会永远挂起。
    • 由于姜饼是一种 recommended 适用于Android的http客户端API。

    Apache Http客户端

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

    请记住,如果您有合适的 com.sun.jersey.api.client.ClientHandler 实施