rest是什么
REST是英文RepresentationalState Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 RoyFielding 在他的博士论文《Architectural Styles and the Design ofNetwork-based Software Architectures 》中提出的。REST并非标准,而是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。REST 基于 HTTP,URI,以及 XML 这些现有的广泛流行的协议和标准,伴随着 REST,HTTP 协议得到了更加正确的使用。
相较于基于 SOAP 和 WSDL 的 Web 服务,REST 模式提供了更为简洁的实现方案。目前,越来越多的 Web 服务开始采用 REST 风格设计和实现,真实世界中比较著名的 REST 服务包括:Google AJAX 搜索 API、Amazon Simple Storage Service (AmazonS3) 等。
2)以遵循RFC-2616 所定义的协议的方式显式地使用 HTTP 方法,建立创建、检索、更新和删除(CRUD:Create, Retrieve, Update and Delete)操作与 HTTP 方法之间的一对一映射:
若要创建资源,应该使用 POST方法, URI : xxx/book(在服务器端新建图书信息,需提供该图书所有信息)
若要检索某个资源,应该使用 GET 方法, URI:xxx/book/{ID} (从服务器端获得某图书信息)
若要更改资源状态或对其进行更新,应该使用 PUT 方法,URI:xxx/book/{ID}(在服务器端更新某已存在的图书信息,需提供更新的内容)
若要删除某个资源,应该使用 DELETE 方法, URI :xxx/book/{ID} (从服务器端删除某图书信息)
相较于基于 SOAP 和 WSDL 的 Web 服务,REST 模式提供了更为简洁的实现方案。目前,越来越多的 Web 服务开始采用 REST 风格设计和实现,真实世界中比较著名的 REST 服务包括:Google AJAX 搜索 API、Amazon Simple Storage Service (AmazonS3) 等。
基于 REST 的 Web 服务遵循一些基本的设计原则:
1)系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的 URI。2)以遵循RFC-2616 所定义的协议的方式显式地使用 HTTP 方法,建立创建、检索、更新和删除(CRUD:Create, Retrieve, Update and Delete)操作与 HTTP 方法之间的一对一映射:
若要创建资源,应该使用 POST方法, URI : xxx/book(在服务器端新建图书信息,需提供该图书所有信息)
若要检索某个资源,应该使用 GET 方法, URI:xxx/book/{ID} (从服务器端获得某图书信息)
若要更改资源状态或对其进行更新,应该使用 PUT 方法,URI:xxx/book/{ID}(在服务器端更新某已存在的图书信息,需提供更新的内容)
若要删除某个资源,应该使用 DELETE 方法, URI :xxx/book/{ID} (从服务器端删除某图书信息)
URI 所访问的每个资源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具体的表现形式取决于访问资源的客户端,客户端与服务提供者使用一种内容协商的机制(请求头与 MIME 类型)来选择合适的数据格式,最小化彼此之间的数据耦合。
jax-rs是什么
我的理解
就是基于上面说的那些rest的定义也好,设计原则也好,java自己也想让使用者按照这样的风格去使用,所以人家自己定义了一套统一的规范,可以让使用者更加方便的来实现上面的这些个各种好处。大体上就是 人家提供了一些列的标注,你自己有个pojo类,吧这些标注都标注上,然后别人一看就知道访问路径,返回信息,参数信息等都是什么, 但是要想将别人的请求映射到这些个方法里并执行并返回,还是需要自己去实现的,由此就产生了很多rest框架,这些框架就是按照人家的这个规范来实现的。
下面是比较好的摘抄。
Java EE 6 引入了对 JSR-311 的支持。JSR-311(JAX-RS:JavaAPI for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了JAXB,从而可以有效缩短 REST 应用的开发周期。
JAX-RS是一套用java实现REST服务的规范,提供了一些标注将一个资源类,一个POJOJava类,封装为Web资源. 这些标注包括以下:
@Path:标注资源类或方法的相对路径。
@GET,@PUT,@POST,@DELETE:标注方法是用的HTTP请求的类型。
@Produces:标注返回的MIME媒体类型。
@Consumes:标注可接受请求的MIME媒体类型。
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam:分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。
@Path:标注资源类或方法的相对路径。
@GET,@PUT,@POST,@DELETE:标注方法是用的HTTP请求的类型。
@Produces:标注返回的MIME媒体类型。
@Consumes:标注可接受请求的MIME媒体类型。
@PathParam,@QueryParam,@HeaderParam,@CookieParam,@MatrixParam,@FormParam:分别标注方法的参数来自于HTTP请求的不同位置,例如@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。
更通俗些说如果你用java写了一套框架,当开发者自己写的JAVA类使用了JAX-RS定义的这些注解标注过,然后通过你写的这套框架就可以将有这些JAX-RS标注的类发布成web资源,供其他客户端程序去调用。那么你写的这套框架就是一套RestFul Web Service框架,就是JAX-RS规范的实现者之一,是JAX-RS标准定义的这些标注的解释执行者。
jax-rs实现框架 resteasy
resteasy简介
RESTEasy是JBoss的一个开源项目,提供一套完整的框架帮助开发人员构建RESTful Web Service和RESTful Java应用程序。它是JAX-RS 2.0规范的一个完整实现并通过JCP认证,通过Http协议对外提供基于Java API的 RestFul Web Service。
RestEasy可以运行在任何Servlet容器中,作为JBoss的官方实现它可以更好的和Jboss服务器紧密融合从而提供更好的用户体验。
作为JAX-RS的标准实现,RestEasy还具有以下亮点特性:
1)不需要配置文件,只要把JARs文件放到类路径里面,添加 @Path等标注就可以了
2)完全的把 RESTEeasy 配置作为Seam 组件来看待
3)HTTP 请求由Seam来提供,不需要一个额外的Servlet
4)Resources 和providers可以作为Seam components (JavaBean or EJB),具有全面的Seaminjection,lifecycle, interception, 等功能支持
5)支持在客户端与服务器端自动实现GZIP解压缩
6)支持异步请求处理
7)支持多种数据传输格式: XML, JSON, YAML, Fastinfoset, Multipart, XOP, Atom
RestEasy可以运行在任何Servlet容器中,作为JBoss的官方实现它可以更好的和Jboss服务器紧密融合从而提供更好的用户体验。
作为JAX-RS的标准实现,RestEasy还具有以下亮点特性:
1)不需要配置文件,只要把JARs文件放到类路径里面,添加 @Path等标注就可以了
2)完全的把 RESTEeasy 配置作为Seam 组件来看待
3)HTTP 请求由Seam来提供,不需要一个额外的Servlet
4)Resources 和providers可以作为Seam components (JavaBean or EJB),具有全面的Seaminjection,lifecycle, interception, 等功能支持
5)支持在客户端与服务器端自动实现GZIP解压缩
6)支持异步请求处理
7)支持多种数据传输格式: XML, JSON, YAML, Fastinfoset, Multipart, XOP, Atom
……
resteasy使用方法
大体使用方法就三部,首先,下载相应的框架jar包,然后,按照jax-rs规范编写自己的service类,最后,在webxml中配置resteasy的两个类即可。配置好了后,项目启动的时候,resteasy就会将你写的service类加载初始化好,并且拦截对应的路径,按照你的service类jax-rs规范的路径匹配,寻找对应方法,并且通过反射来执行,并将返回值返回。类似下图
resteasy原理概述
简单查阅了网络的源码分析和自己的简单查看,大体上resteasy的工作原理分两步,正好也就配置两个类,
项目监听器ResteasyBootstrap
他主要做的工作就是,在项目启动的时候,执行自己的方法,将resteasy框架的各种自己的组件都给初始化起来,其中就会将你在web.xml中配置的(或者其他方法配置的)services类给加载到框架中,解析包装一下,以便后面使用。
请求分发 HttpServletDispatcher
这个分发器就将过来的请求,进行解析,并且通过第一步加载进来的service的信息,找到匹配的包装类,找到对应的方法,通过反射就直接执行了,并将执行结果返回回去。
resteasy好像还有另外一种配置方法,但是不管咋说,肯定都是这么些个工作,先加载,后使用。
dubbox使用resteasy
最近在看dubbox的时候,看到dubbox在dubbo的基础上加上了rest风格的服务实现,jax-rs规范实现框架就是用的resteasy,看了下配置rest的时候,也得在web.xml中配置如下
查看里面的源码就知道,里面也封装有jboss的那个原声resteasy实现方式。