前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaEE的RESTful标准技术JAX-RS,jersey-client客户端使用介绍【享学Java】

JavaEE的RESTful标准技术JAX-RS,jersey-client客户端使用介绍【享学Java】

作者头像
YourBatman
发布2020-03-18 20:39:45
5.5K0
发布2020-03-18 20:39:45
举报
文章被收录于专栏:BAT的乌托邦BAT的乌托邦

软件开发往往是这样:最开始的 90% 代码占用了开始的 90% 的开发时间;剩下10% 代码同样需要 90% 的开发时间。

目录
  • 前言
  • 正文
    • 何为JAX-RS(1.0和2.0)
      • JSR 311
      • JSR 339
      • 落地产品
    • Jersey
      • 1.x和2.x的区别
    • jersey-client
      • 使用示例
      • jersey-client vs HttpClient
  • 总结
    • 声明

前言

Spring大行其道的今天,很多人对Java的RESTful规范JAX-RS可能比较陌生甚至未曾听闻,当然这也是能被“理解”的,毕竟Spring似乎现在已是JavaEE的事实标准。

现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开Web API,因此REST变得越来越重要和流行。使用Ajax进行通信的富浏览器端也在朝这个目标不断迈进。这个架构原则提升了万维网的可伸缩性,无论何种应用都能从该原则中受益无穷。


正文

其实关于JAX-RS的资料并不算多,根据存在即合理原则我们需要承认它的重要性肯定比不上Spring,但是由于老外一般喜欢使用JavaEE规范技术,所以使得一些开源社区框架使用的均是基于JAX-RS的实现,因此对它来个简单的了解还是很有必要的。


何为JAX-RS(1.0和2.0)

JAX-RS是JAVA EE6引入的一个新技术,它的英文全称为Java API for RESTful Web Services,它的核心概念是Resource,即面向资源。JavaEE 6于2019年12月份正式发布。


JSR 311

它被称为JAX-RS 1.0标准,它提供一套JSR311标准API:

代码语言:javascript
复制
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>jsr311-api</artifactId>
    <version>1.1.1</version>
</dependency>
在这里插入图片描述
在这里插入图片描述

这些注解和Spring MVC@RequestMapping、@RequestParam、@PathVariable...何其相似,各位可以类比起来学习,本处不必一一展开。但是注意一点,SpringMVC在开发REST应用时,是不支持JSR311标准的。


JSR 339

它是JAX-RS 2.0版本,于2018年发布。它不仅定义了一套用于构建 RESTful 网络服务的 API,同时也通过增强客户端 API 功能简化了REST 客户端的构建过程。

代码语言:javascript
复制
<dependency>
    <groupId>jakarta.ws.rs</groupId>
    <artifactId>jakarta.ws.rs-api</artifactId>
    <version>2.1.6</version>
</dependency>
在这里插入图片描述
在这里插入图片描述

规范API的向下兼容度还是非常好的,它在1.0规范的基础上对Client的构建做了增强,如提供了javax.ws.rs.client.ClientBuilderjavax.ws.rs.client.WebTarget等实用API。


落地产品

每个JavaEE规范都应对应其落地产品的实现,就像JPA的实现落地实现有HibernateTopLink等。基于JAX-RS实现的框架有Jersey、RESTEasy,当然还有Apache CXF。但是,因为Jersey是最早的实现(出现得比JSR311还早),是JSR311参考的主要对象,所以,可以说Jersey就是事实上的标准,就像Hibernate是JPA的事实标准一样~

值得一提的是:RESTEasy是由JBoss公司开发的,所以将用RESTEasy框架实现的应用部署到JBoss服务器上,可以实现很多额外的功能(但很显然,JBoss已经退出了历史舞台)。


Jersey

Jersey是一个REST框架,既然是REST框架,那自然提供了REST服务相关的一切东西。因此在使用过程中,你可以同Spring MVC做对比,部署到Servlet容器上即可运行,形如这样:

代码语言:javascript
复制
@Path("/api/v1/user")
public class UserResource{

    @GET
    @Path("/{username}")
    @Consumes({"application/json", "application/xml"})
    @Produces("application/json")
    public String getUser(@PathParam("username") String username){
        ...
    }
}

作为服务端,它使用的库是:

代码语言:javascript
复制
1.x:
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.19.4</version>
</dependency>

2.x:
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.30.1</version>
</dependency>

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版本

代码语言:javascript
复制
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.19.4</version>
</dependency>

它的jar包依赖情况如下:

在这里插入图片描述
在这里插入图片描述
使用示例
代码语言:javascript
复制
@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));
}

运行程序,控制台打印:

代码语言:javascript
复制
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源生的URLConnectionApache HTTPClient附上一个对比图:

在这里插入图片描述
在这里插入图片描述

总体上HttpClient比HttpURLConnection功能更加丰富且好用,但是更加占用内存和CPU资源,大家都知道!当然,若你在Spring环境下需要使用Rest Client,那就用RestTemplate吧~


总结

本文介绍了JAX-RS标准JavaEE技术,并且对JSR 311/JSR 339等做了一个简单的科普,示例了jersey-client的使用介绍。个人觉得过于国内程序员来说JAX-RS技术(jersey的使用)不用太过于深究,浅尝辄止即可。

分隔线
分隔线

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 前言
  • 正文
    • 何为JAX-RS(1.0和2.0)
      • JSR 311
      • JSR 339
      • 落地产品
    • Jersey
      • 1.x和2.x的区别
    • jersey-client
      • 使用示例
      • jersey-client vs HttpClient
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档