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

Java Jersey客户端和Apache HTTP客户端如何比较?,java,apache-httpclient-4.x,apache-commons-httpclient,jersey-client,Java,Apache Httpclient 4.x,Apache Commons Httpclient,Jersey Client,首先,我不是想在这里挑起一场火焰战。我非常了解Jersey,但几乎没有使用过httpclient jersey客户端和Apache的httpclient之间的主要区别是什么?在哪些方面一个比另一个好?有没有比较好的图表?对于较大的文件(比如2048MB),哪一个性能更好 非常感谢您的评论 这两件事可能不应该直接比较。Jersey是一个REST客户端,具有完整的JAX-RS实现、简洁流畅的API和强大的过滤器堆栈。ApacheHTTP客户端是一个Http客户端,在管理诸如超时、复杂代理路由和连接轮

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

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


非常感谢您的评论

这两件事可能不应该直接比较。Jersey是一个REST客户端,具有完整的JAX-RS实现、简洁流畅的API和强大的过滤器堆栈。ApacheHTTP客户端是一个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);
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);
Jersey与Apache Http客户端后端示例:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);
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);
请注意上一个示例中处理程序的用法。这是Jersey整合和利用各种后端的关键集成抽象。第一个示例使用
URLConnectionClientHandler
在引擎盖的深处

说到性能和特性,比较ApacheHTTP客户机和Jersey没有什么意义。这里可能需要比较不同的Jersey后端,因为Jersey本身只是一个包装API。根据我自己的经验,我想强调一下HttpUrlConnection和Apache Http客户端之间的一些关键区别:

HttpUrlConnection

  • 不需要外部依赖项。这在嵌入式或移动平台上可能非常有价值
  • 到处都有很好的记录
  • 设计糟糕的API<基于代码>HttpUrlConnection的实现很难维护和扩展
  • 许多特性是通过JVM属性配置的,其中一些在运行时可能是不可重新配置的
  • 在某些情况下,无法处理超时。您可能最终会为不同的超时设置10个不同的JVM属性,并且在某些情况下仍然会永久挂起连接
  • 因为姜饼是Android的http客户端API
Apache Http客户端

  • 对于3.X版本,它的性能有点类似于
    HttpUrlConnection
    。版本4.1包含了大量的性能改进,其性能比对应的版本要好得多
  • 非常擅长管理连接和数据读取超时
  • 它的设计如下,因此您可以使用自己的实现定制HTTP处理的几乎任何部分。示例:重定向策略、重试策略、自定义cookie存储、请求/响应拦截器等
  • 通过可定制的路由生成器为复杂的多代理路径提供丰富的代理支持
  • 具有现成的每条路由连接池。如果使用SSL/TLS,这可能会带来良好的性能优势,特别是涉及硬件PKCS#11令牌
    HttpUrlConnection
    也有一个内部池,但是您没有工具来自定义池的内容或时间,也没有监控工具来检查池的状态
  • 详细日志功能

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

感谢您指出Jersey默认为
HttpUrlConnection
,这在处理大文件时是一个坏主意,因为它在内存中映射这些文件,导致性能低下。我不太确定我是否完全同意Jersey只是一个RESTAPI客户端的说法。Jersey客户端也是一个HTTP客户端。您拥有所有的流,但是-是的-默认情况下,它围绕HttpUrlConnection包装了所有这些。也许我还缺少一些东西…?它肯定有流,但这些流是由底层ClientHandler实现提供的。从理论上讲,这些流可能来自任何地方,可能是内存缓冲的,也可能不是——所有这些都取决于底层http客户端实现。您甚至可以编写不涉及任何网络的ClientHandler,Jersey作为包装器完全可以。您有没有示例说明如何使用Jersey客户端2.20和Apache Httpclient实现这一点?我这样问是因为jersey-apache-client4似乎没有足够的新版本。另外,有关
Client Client=new Client(new ApacheHttpClient4Handler…
位的代码不正确,或者现在已过期。你觉得你可以更新一下吗?谢谢!