JAX-RS的介绍与使用
本文最后更新于:2 年前
JAX-RS
简介
JAX-RS是Java API for RESTful Web Service的缩写,它是在Java中实现RESTful API的通用标准,是一组由Java EE提供的接口和注解。与传统的 servlet 模型相比,JAX-RS提供了一种可行的、更为简便、移植性更好的方式来在Java内实现RESTful服务。JAX-RS 提供的一些关键功能部件包括:
- 一组用于声明资源类及其所支持数据类型的注释
- 一组允许应用程序开发者访问运行时上下文的接口
- 用于集成定制内容处理程序的可扩展框架
与JDBC类似,JAX-RS只是定义了在Java中实现RESTful API的一些标准,但是没有自己实现。具体的实现需要依赖于对应的来源,常见的JAX-RS的实现包括下面一些:
- Apache CXF:是一个开源的Web服务框架
- Jersey:由Sun提供的JAX-RS的参考实现框架,注意提出JAX-RS标准的也是Sun
- RESTEasy:JBoss的实现
- Restlet:由Jerome Louvel和Dave Pawson开发,是最早的REST框架
- Apache Wink:是一个处于Apache软件基金会孵化器中的项目,其服务模块实现了JAX-RS规范
规范内容
在JavaEE中包含了JAX-RS中主要使用的接口和注解,它们都位于在包javax.ws.rs.*
下。JAX-RS提供了一些标注将资源类或者POJO类封装为Web资源,常用的标注包括:
@Path
:标注资源类或方法的相对路径,如果标注在方法上,则表示具体的请求路径@GET, @PUT, @POST, @DELETE
:标注方法使用的HTTP请求的类型,分别对应 4 种 HTTP 方法,分别用于检索、更新、创建和删除资源的操作。在RESTful API中,请求方式+请求路径才能唯一定义一个API若要创建资源,应该使用 POST 方法
若要检索某个资源,应该使用 GET 方法
若要更改资源状态或对其进行更新,应该使用 PUT 方法
若要删除某个资源,应该使用 DELETE 方法
@Produces
:标注返回的MIME媒体类型,可以使用枚举类来指定,也可以使用字符串同时指定多种返回类型1
2
3
4
5@Produces(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
@Produces({"application/json", "application/xml"})@Consumes
:标注可接受请求的MIME媒体类型,使用方式和@Produces相同,含义则正好相反Param相关注解:标注方法的参数来自于HTTP请求的不同位置。在方法参数上标注对应注解之后,参数就能够获取到对应的值
@PathParam
:标识参数来自于URL的路径@QueryParam
:标识参数来自于URL的查询参数@HeaderParam
:标识参数来自于HTTP请求的头信息@CookieParam
:标识参数来自于HTTP请求的Cookie@FormParam
:获取Post请求中表单中的数据@BeanParam
:获取请求参数中的数据,并用实体Bean进行封装
@Context
:用于解析上下文参数,通过该注解可以获得UriInfo、ServletConfig、ServletContext、HttpServletRequest、HttpServletResponse和HttpHeaders等信息
Jersey的使用
Jersey是JAX-RS的一种实现,下面简单介绍相关的使用方式。
首先需要创建一个JavaWeb项目,具体创建方式可以参考JavaWeb笔记(2)-Tomcat的使用
-
EverNorif。创建好Web项目之后,在pom.xml
中引入如下依赖:
1 |
|
之后在web.xml
中配置如下内容:
1 |
|
其中这里需要注意两个配置,第一个就是在servlet
标签中的init-param中的value,这里需要设置的我们对应类资源的包。另一个是在servlet-mapping
中的url-pattern
,后续访问时会使用到这个值。
配置完成之后,就可以写一个简单的资源类:
1 |
|
这表示我们现在有Message的资源,通过Get方法可以进行访问。启动Web项目之后,则可以访问如下的链接:http://localhost:8080/<context-path>/rest/message
,就会得到Hello
World信息。这里的/rest
就是在web.xml中的配置,/message
则是在资源类中Path
注解的值。同时也可以发送对应的post请求:http://localhost:8080/<context-path>/rest/message/<text>
,之后在控制台就会输出对应的text的内容
结合SpringBoot使用
在开发Web项目时,我们更多会使用SpringBoot。而在SpringBoot中结合使用JAX-RS,能帮助我们更方便的创建RESTful风格的API。在SpringBoot中引入Jersey的依赖要简单许多,可以直接通过starter进行引入:
1 |
|
引入依赖之后,我们可以创建如下的资源类:
1 |
|
其中message表示资源路径,sayHello表示访问路径。
为了在SpringBoot中使用Jersey,我们需要进行相关的配置。Springboot中对Jersey的配置有三种方式:第一种方式创建一个自定义的ResourceConfig;第二种方式,是返回一个ResourceConfig类型的@Bean,第三种方式,配置一组ResourceConfigCustomizer对象。这里我们使用第一种方式:
1 |
|
首先这个配置类继承了ResourceConfig
,并且使用@Configuration
进行标注。在这个类中我们需要完成资源类的注册,注册后的资源才能够进行访问。Springboot默认把Jersey的根路径映射在/*上;如果要更改默认的根路径设置,对于自定义的ResourceConfig方式来说,可以在类上面添加一个@ApplicationPath
注解即可。当然也可以在application.yaml中添加配置来改变项目的根路径:
1 |
|
至此我们就完成了Jersey在SpringBoot中的结合。启动项目之后,可以访问对应的资源,使用链接http://localhost:8080/resource/message/sayHello?msg=hahaha
,这样就能够访问到对应的资源,在控制台中也会打印出对应的提示信息。