繁体   English   中英

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

[英]How do Jersey-client and Apache HTTP Client compare?

首先,我不是想在这里开始一场火焰战争。 我非常了解泽西岛,但很少使用httpclient。

jersey-client和Apache的httpclient之间的主要区别是什么? 哪个区域比另一个好? 在某处有一个很好的比较图表吗? 对于较大的文件(比如2048 MB),哪一个表现更好?

非常感谢您的评论!

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

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的用法。 这是泽西岛的一个关键整合抽象,可以整合和利用各种后端。 第一个例子深入使用URLConnectionClientHandler

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

HttpURLConnection的

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

Apache Http客户端

  • 对于3.X版本,它的性能有点类似于HttpUrlConnection 版本4.1包含许多性能增强,并且执行方式比对应版本更好
  • 非常擅长管理连接和数据读取超时
  • 它的设计遵循开放/封闭原则 ,因此您可以使用自己的实现自定义HTTP处理的几乎任何部分。 示例:重定向策略,重试策略,自定义cookie存储,请求/响应的拦截器等。
  • 为复杂的多代理路径提供可定制路由构建器的丰富代理支持
  • 具有开箱即用的每个路由连接池。 如果使用SSL / TLS,这可能会带来良好的性能优势,特别是涉及硬件PKCS#11令牌。 HttpUrlConnection还有一个内部池,但是你没有工具可以自定义什么或什么时候池,没有监控工具来检查池状态。
  • 具有详细的日志

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM