Jersey客户端和Apache HTTP客户端有何区别?

57

首先,我不想在这里引发任何争端。我相当熟悉Jersey,但几乎没有使用过httpclient。

jersey-client和Apache的httpclient之间有哪些关键区别?它们各自的优势在哪些方面?是否有好的比较表格?哪个更适用于处理大文件(比如2048 MB)?

非常感谢您的评论!

1个回答

96
这两个东西可能不应该直接进行比较。Jersey是一个REST客户端,具有完整的JAX-RS实现、简洁流畅的API和强大的过滤器堆栈。Apache Http Client是一个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 Client后端的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
就性能和功能而言,将Apache Http Client与Jersey进行比较没有太大意义。人们可能想在这里比较不同的Jersey后端,因为Jersey本身只是一个包装API。根据我的经验,我想强调一些HttpUrlConnection和Apache Http Client之间的关键差异: HttpUrlConnection
  • 不需要外部依赖库。这在嵌入式或移动平台上可能非常有价值。
  • 无处不在地有极好的文档
  • API设计很糟糕。基于HttpUrlConnection的实现难以维护和扩展。
  • 许多特性是通过JVM属性配置的,其中一些在运行时可能是不可重新配置的。
  • 在某些情况下,处理超时问题无望。你可能会为不同的超时设置10个不同的JVM属性,在某些情况下仍然会永远挂起连接。
  • 自从Gingerbread以来,它是Android的recommended http客户端API。
Apache Http Client
  • 对于3.X版本,其性能与HttpUrlConnection有些相似。4.1版本包含大量性能增强,比其同类表现更好
  • 非常擅长管理连接和数据读取超时
  • 它的设计遵循开闭原则,因此您可以使用自己的实现自定义HTTP处理的几乎任何部分。例如:重定向策略、重试策略、自定义cookie存储、请求/响应的拦截器等。
  • 提供了可定制的路由构建器,支持复杂的多代理路径
  • 具有针对每个路由的连接池。如果使用SSL/TLS,特别是涉及硬件PKCS#11令牌,则可能会带来良好的性能优势。HttpUrlConnection也具有内部池,但您没有工具来自定义何时进行池化,也没有监视设施来检查池状态。
  • 具有详细的日志记录功能

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


3
感谢指出 Jersey 默认使用 HttpUrlConnection,这是处理大文件时不好的选择,因为它会将文件映射到内存中,导致性能下降。我不确定是否完全同意 Jersey 只是一个 REST API 客户端的说法。Jersey 客户端也是 HTTP 客户端。你可以使用所有流,但是默认情况下它确实使用 HttpUrlConnection 进行封装。也许我还有什么不理解的地方...? - carlspring
1
它肯定有流,但这些流是由底层的ClientHandler实现提供的。理论上,这些流可能来自任何地方,可以是内存缓冲或非缓冲 - 这完全取决于底层的http客户端实现。甚至可以编写不涉及任何网络和Jersey的ClientHandler包装器,Jersey也将完全支持它。 - Jk1
7
你有没有使用jersey-client 2.20和Apache Httpclient使这个工作的示例?我之所以问是因为jersey-apache-client4似乎没有足够新的版本。另外,你关于 Client client = new Client(new ApacheHttpClient4Handler...) 部分的代码是错误的或已经过时了。你觉得能否更新一下呢?非常感谢! - carlspring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接