这两件事可能不应该直接比较。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
实施