说明:博客文章内容摘抄自于参考文章的文章内容,由参考文章整理所得。
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仓自行下载。
<dependency>
<groupId>javax.ws.rsgroupId>
<artifactId>javax.ws.rs-apiartifactId>
<version>2.1-m09version>
dependency>
注释被用来描述根资源、子资源方法或子资源的位置,标注资源类或方法的相对路径。若希望一个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();
}
@GET,@PUT,@POST,@DELETE,标注方法是用的HTTP请求的类型,分别对应 4 种 HTTP 方法,用于对资源进行创建、检索、更新和删除的操作。HTTP GET 请求被映射到由 @GET 注释的方法;HTTP POST 请求被映射到由 @POST 注释的方法,以此类推。用户可能还需要通过使用 @HttpMethod 注释定义其自己的定制 HTTP 请求方法指示符。
@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();
}
@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();
}
@PUT注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPPUT请求。资源的行为由资源回应的HTTP方法决定。
@DELETE注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPDELETE请求。资源的行为由资源回应的HTTP方法决定。
@HEAD注解是请求方法指示符,这个指示符注解的Java方法会处理HTTPHEAD请求。资源的行为由资源回应的HTTP方法决定。
获取信息,关于资源的哪些属性是客户端可以改变的。
每个资源方法最多只能有一个没有注解的参数。这个没有注解的参数为请求体(entity)的内容
@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);
}
@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);
}
客户端在请求中告诉服务器它期望的返回消息体内容格式,包括使用什么数据格式,怎么编码,使用哪国语言,服务接口的哪个版本等。这种协议被称为Http Content Negotiation(Http内容协定,简称Conneg)。
@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();
}
@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();
}
响应码 | 含义 |
---|---|
100 | 继续 |
101 | 分组交换协议 |
200 | OK |
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 | 网关超时 |
505 | HTTP版本未被支持 |
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
JAX-RS API
javax.ws.rs