java JAX-RS

Posted 天才小小布

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java JAX-RS相关的知识,希望对你有一定的参考价值。

说明:博客文章内容摘抄自于参考文章的文章内容,由参考文章整理所得。

一、简介

Java Web有很多成熟的框架,主要可以分为两类Web Application和Web Services。用于Web Application的框架包括官方的Servlet/JSP, JSTL/JSF以及第三方Struts/Spring MVC(action-based)。Web Services的项目又可以分为基于XML的(SOAP/WSDL)的和基于JSON的,Java Communitiy为这两种方式都定义了标准,Java EE5引入了JAX-WS(Java API for XML Web Services)-JSR224,Java EE6引入了JAX-RS(Java API for RESTful Web Services)-JSR331。RESTful Service由于轻量,好测试,有弹性等特点,越来越受欢迎。Jersey,RESTEasy都是JAX-RS标准的具体实现。

二、作用

JAX-RS:(Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。是一个Java编程语言的应用程序接口,支持按照表象化状态转变 (REST)架构风格创建Web服务Web服务。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了 JAXB,从而可以有效缩短 REST 应用的开发周期。

三、特点

与传统的 servlet 模型相比,JAX-RS 提供了一种可行的、更为简便、移植性更好的方式来在 Java 内实现 RESTful 服务。使用注释让您能够轻松提供 Java 资源的路径位置并将 Java 方法绑定到 HTTP 请求方法。一种可移植的数据绑定架构提供了一些本机的 Java 类型支持并允许进行序列化/反序列化处理的完全定制。javax.ws.rs.core.Application 子类的扩展以及 web.xml 内的相应清单表明了用最少的部署描述符配置就能进行轻松部署。

四、实现

JAX-RS 的具体实现由第三方提供,例如 Sun 的参考实现 Jersey、Apache 的 CXF 以及 JBoss 的 RESTEasy。

使用JAX-RS需要相关jar包,可去maven仓自行下载。

<!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api -->
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1-m09</version>
</dependency>

五、注解

1 资源类或方法的相对路径注解

(1)@Path

注释被用来描述根资源、子资源方法或子资源的位置,标注资源类或方法的相对路径。若希望一个Java类能够处理REST请求,则这个类必须至少添加一个@Path(“/”)的注解;对于方法,这个注解是可选的,如果不添加,则继承类的定义。Path也支持正则表达式,例如:@Path(“id: \\d+”)

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/jaxrs")
public interface JAXRS 

    @GET
    @Path("/getPath")
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void pathClass();

2 请求方法注解

@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型,分别对应 4 种 HTTP 方法,用于对资源进行创建、检索、更新和删除的操作。HTTP GET 请求被映射到由 @GET 注释的方法;HTTP POST 请求被映射到由 @POST 注释的方法,以此类推。用户可能还需要通过使用 @HttpMethod 注释定义其自己的定制 HTTP 请求方法指示符。

*(1)@GET

@GET注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPGET请求。资源的行为由资源回应的HTTP方法决定。

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/jaxrs")
public interface JAXRS 

    @GET
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void getClass();
   

*(2)@POST

@POST注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPPOST请求。资源的行为由资源回应的HTTP方法决定。

import javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;

@Path("/jaxrs")
public interface JAXRS 

    @POST
    @Consumes( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void postClass();
  

(3)@PUT

@PUT注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPPUT请求。资源的行为由资源回应的HTTP方法决定。

(4)@DELETE

@DELETE注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPDELETE请求。资源的行为由资源回应的HTTP方法决定。

(5)@HEAD

@HEAD注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPHEAD请求。资源的行为由资源回应的HTTP方法决定。

(6)@OPTIONS

获取信息,关于资源的哪些属性是客户端可以改变的。

3 参数注入注解

每个资源方法最多只能有一个没有注解的参数。这个没有注解的参数为请求体(entity)的内容

(1)@PathParam

@PathParam注解是可以抽取并用在资源类中的一类参数。URIpath参数是从请求的URI中抽取的,而且参数的名称和@Path注解中定义的变量名对应。

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

@Path("/jaxrs")
public interface JAXRS 

    @GET
    @Path("/getPathParam/id")
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void pathParamClass(@PathParam("id") String id);
 

(2)@QueryParam

@QueryParam注解是可以抽取并在资源类中使用的一类参数。Query参数是从请求URI的查询参数中抽取的。

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.PathParam;

@Path("/jaxrs")
public interface JAXRS 

    @GET
    @Path("/getQueryParam")
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void queryParamClass(@PathParam("id") String id);
 

4 内容协议注解

客户端在请求中告诉服务器它期望的返回消息体内容格式,包括使用什么数据格式,怎么编码,使用哪国语言,服务接口的哪个版本等。这种协议被称为Http Content Negotiation(Http内容协定,简称Conneg)。

(1)@Consumes

@Consumes注解是用来指定资源能够接受的客户发送的MIME媒体类型。

import javax.ws.rs.Path;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.Consumes;

@Path("/jaxrs")
public interface JAXRS 

    @POST
    @Consumes( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void consumesClass();
 

(2)@Produces

@Produces注解用来指定资源能够生成并发送给客户端的MIME媒体类型,例如“text/plain”

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;

@Path("/jaxrs")
public interface JAXRS 

    @GET
    @Path("/getProduces")
    @Produces( application/json;charset=UTF-8, application/xml;charset=UTF-8 )
    public void producesClass();
 

六、异常处理

1 HTTP中定义的响应状态码

响应码含义
100继续
101分组交换协议
200OK
201被创建
202被采纳
203非授权信息
204无内容,返回值为null或void
205重置内容
206部分内容
300多选项
301目标永久性转移
302目标暂时性转移
303参见其他
304未改动
305使用代理
307暂时重定向
400错误请求
401未授权
402要求付费
403禁止
404未找到,网页/Path未找到
405不允许的方法,请求的方法未找到
406不被采纳,请求的期望返回交换类型不匹配
407要求代理授权
408请求超时
409冲突
410过期的
411要求的长度
412前提不成立
413请求实例太大
414请求URL太大
415不支持的媒体类型
416无法满足的请求范围
417失败的预期
500内部错误
501未被使用
502网关错误
503不可用的服务
504网关超时
505HTTP版本未被支持

2 WebApplicationException

WebApplicationException是一个内置的、非检测异常,支持传入Response对象或者状态码。

当JAX-RS碰到一个WebApplicationException抛出时,它会捕获这个异常,调用getRespnse()方法获取Response,发回给客户端。如果应用以一个状态码或者Response初始化了WebApplicationException,则这个状态码或者Response将被用来创建真正的Http响应;否则会直接返回500服务器内部错误给客户端。

    @GET
    @Path("/error/id")
    @Produces("application/xml")
    public void errorClass(@PathParam("id") int id) 
        throw new WebApplicationException("404");
    

参考文章

RESTful和JAX-RS
Spring MVC与JAX-RS比较与分析
JAX-RS及标注
JAX-RS详解
JAX-RS规范基础
使用JAX-RS创建RESTful Web Service

GitHub

JAX-RS API

Maven

javax.ws.rs

以上是关于java JAX-RS的主要内容,如果未能解决你的问题,请参考以下文章

Java基于JAX-RS开发Restful接口总结

ExtJs 4:如何在一个请求中发送所有修改、新和删除的记录?

java JAX-RS

什么是 JAX-RS 实现?

JAX-RS的介绍

对于 Java 中的 RESTful 服务,JAX-RS 是不是比 Swing、Grails 或 Play 等 MVC 框架更好?