REST是一种软件架构模式,只是一种风格,不是像SOAP那样本身承载着一种消息协议,(两种风格的web服务均采用HTTP做传输协议是因为HTTP协议能穿越防火墙,JAVA的远程调用RMI等是重量级协议,不能穿越防火墙),因此你也可以叫做REST是基于HTTP协议的软件架构。REST中重要的两个概念就是资源定位和资源操作,而HTTP协议恰好完整的提供了这两个要点,HTTP协议中的URI可以完成资源定位,GET、POST、OPTION等方法可以完成资源操作,因此REST完全依赖HTTP协议就可以完成Web服务,而不像SOAP协议那样只利用HTTP的传输特性,定位与操作由SOAP协议自身完成,也正是由于SOAP消息的存在,使得SOAP笨重。你也可以说REST充分利用了HTTP协议的特性,而不是像SOAP那样只利用了其传输这一特性(事实上大多数人提到HTTP协议就只会想到他能用于数据传输)。
REST对于HTTP的利用分为以下两种:首先是资源定位,这就是URI,这本身没有什么特别的,但要注意REST对HTTP的资源定位理解更加到位,也就是你的Web服务的URI要能足够表意,例如http://www.fetion.com.cn/fetionwap/baby/getBabyInfoById?id=1,从URI上可以看出这个Web服务定位到的资源是查询飞信WAP宠物的信息,依据参数id值查询。那么可以继续出现以下层级:
http://www.fetion.com.cn/fetionwap/baby/storeroom/getStoreRoomById?id=1
http://www.fetion.com.cn/fetionwap/baby/storeroom/chicken/getCounts?id=1
我们看到REST风格的URI的目录层级足够表意,也就是资源定位,这种定位要求URI是唯一的。因为REST流行于互联网,网上的资源应该有唯一的资源位置(如:如片、视频)。当然,如果你的服务越复杂,URI可能就越长,越难理解,这也算是REST风格的缺点。第二种就是利用HTTP的GET、POST、PUT、DELETE四种操作外加HEAD请求报头完成资源操作,有这几种最简单的操作任意组合就可以完成各种各样的复杂操作,当然这是REST的理念,事实上这样创建应用有点牵强。
REST是一种软件架构理念,现在被移植到Web服务上(因此不要提到REST就马上想到WebService,JAX-RS只是将REST涉及风格应用到Web服务开发),那么在开发Web服务上,偏于面向资源的服务只适用于REST,偏于面向活动的服务。另外,REST简单易用,效率高,SOAP成熟度较高,安全性好。
REST提供的网络服务叫做OpenAPI,它不仅把HTTP作为传输协议,也作为处理数据的工具,可以说对HTTP协议做了较好的诠释,充分体现了HTTP技术的网络能力。目前Google、Amazon、淘宝都有基于REST的OpenAPI提供调用。
JAX-RS的API在javax.ws.rs.*包中,其中大部分也是注解。
我们先看一个较为简单的实例:
(1)IStudentServie.java:
package com.nantian.rest.server; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; @Path(value = "/student/{id}") @Produces("application/xml") public interface IStudentService { @GET @Path(value = "/info") Student getStudent(@PathParam("id") long id, @QueryParam("name") String name); @GET @Path(value = "/info2") Student getStudent(@QueryParam("name") String name); }