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

car*_*ing 49 java apache-commons-httpclient apache-httpclient-4.x jersey-client

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

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

非常感谢您的评论!

Jk1*_*Jk1 78

这两件事可能不应该直接比较.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);
Run Code Online (Sandbox Code Playgroud)

泽西使用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);
Run Code Online (Sandbox Code Playgroud)

请注意最后一个示例中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-client 2.20和Apache Httpclient的例子吗?我问,因为`jersey-apache-client4`似乎没有足够新的版本.您的客户端客户端=新客户端(新的ApacheHttpClient4Handler ...)`位的代码也不正确,或者现在已经过时了.你认为你可以更新吗?非常感谢! (5认同)
  • 感谢指出Jersey默认为"HttpUrlConnection",这在处理大文件时使用是个坏主意,因为它将它们映射到内存中会导致性能不佳.我不太确定我是否完全同意Jersey只是一个REST API客户端的说法.Jersey客户端也是HTTP客户端.你拥有所有的流,但是 - 是的 - 默认情况下它会围绕HttpUrlConnection包装所有这些.也许我还在遗漏一些东西......? (2认同)