1.x和2.x的区别
1.x在2017年5月发布其最后一个版本1.19.4后就已经寿终正寝了,因此不建议再使用。2.x从2013年发布迭代至今,是现在推荐的使用方式(可见它俩重叠开发了好几年)。
1.x和2.x版本互不兼容,核心API均出现了一定的差异性,举例如下:
- 实现规范:
- 1.x:实现的JAX-RS 1.0规范,也就是JSR 311
- 2.x:实现的JAX-RS 2.0规范,也就是JSR 339
- Servlet容器全类名:
- 1.x:com.sun.jersey.spi.container.servlet.ServletContainer(sun公司)
- 2.x: org.glassfish.jersey.servlet.ServletContainer(glassfish公司)
- 资源扫描:
- 1.x:com.sun.jersey.config.property.packages
- 2.x:jersey.config.server.provider.packages
- 注解支持:
- 1.x:不支持Servet3.x的注解
- 2.x:支持注解如@WebServlet来扫描jersey的资源
- …
说明:glassfish是一款web应用服务器,和tomcat一样,也是一款优秀的Servlet容器。它既是EJB容器也是WEB容器,由Sun公司开发(现Oracle赞助)。
jersey-client
以上大体介绍了jersey作为Server端技术的实施,接下来介绍其客户端API,这便是jersey-client工程。Jersey的客户端API能够让我们非常方便的创建出REST的Web服务客户端,不管是客户端应用,还是用于测试的代码,都是非常容易和舒服的。
特别说明:本文讲解、实例使用的jersey-client版本是1.x版本,1.x版本,1.x版本
<dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-client</artifactId> <version>1.19.4</version> </dependency>
它的jar包依赖情况如下:
使用示例
@Test public void fun1() { // 1、创建一个Client DefaultClientConfig clientConfig = new DefaultClientConfig(); Client client = Client.create(clientConfig); // 2、准备一个WebResource,等待发送请求(注意:http前缀不能省) // WebResource webResource = client.resource( URI.create("www.baidu.com")); WebResource resource = client.resource("http://www.baidu.com"); // 3、发送get/post请求获取资源 // String result = resource.get(String.class); // System.out.println(result); // 若你想获取响应详情,可以使用ClientResponse ClientResponse response = resource.get(ClientResponse.class); System.out.println(response.getStatus()); System.out.println(response.getHeaders()); System.out.println(response.getLocation()); System.out.println(response.getEntity(String.class)); }
运行程序,控制台打印:
/
200 {Server=[bfe], Content-Length=[2381], Date=[Sat, 14 Mar 2020 09:55:47 GMT], Content-Type=[text/html]} null <!DOCTYPE html> ... // 百度首页的html,略
说明:Client的构建属于昂贵资源,因此请重复使用它,它底层使用的java.net.HttpURLConnection进行请求发送的
jersey-client vs HttpClient
在Java中,REST Client实现方式有多种,比如JBoss RestEasy、 Sun Jersey、Dropwizard、Apache HTTPClient、OkHttp等等。很多人直接使用Apache Http Client, 我并不推荐直接使用这个库,主要是因为这个库相对比较底层,需要自己处理的东西很多,,API也相对繁琐。
另外,对于JDK源生的URLConnection和Apache HTTPClient附上一个对比图:
总体上HttpClient比HttpURLConnection功能更加丰富且好用,但是更加占用内存和CPU资源,大家都知道!当然,若你在Spring环境下需要使用Rest Client,那就用RestTemplate吧~
说明:jersey社区贡献了一个项目com.sun.jersey.contribs:jersey-apache-client4,它是基于Apache的HC发送请求的,具有更好的效率,使用得也是比较广泛的
总结
本文介绍了JAX-RS标准JavaEE技术,并且对JSR 311/JSR 339等做了一个简单的科普,示例了jersey-client的使用介绍。个人觉得过于国内程序员来说JAX-RS技术(jersey的使用)不用太过于深究,浅尝辄止即可。