JAVA的 WebService规范 JAX-RS(一)

2014-11-24 08:42:01 · 作者: · 浏览: 4
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 请求报头完成资源操作,你可以把前四种HTTP 的操作类比成 数据库操作的SELECT、UPDATE、INSERT、DELETE 操作,有这几种最简单的操作任意组合就可以完成各种各样的复杂操作,当然这是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.*包中,其中大部分也是注解。
上一个简单的例子说明如何使用。
需要jsr311-api这个jar包。
package JAXRS;
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);
}
说明:
1.这个REST 的服务接口的最终响应结果是XML(@Produces 注解标注,这个注解可以包含一组字符串,默认值是*/*,它指定REST 服务的响应结果的MIME 类型,例如:
application/xml、application/json、image/jpeg 等),你也可以同时返回多种类型,但具体生成结果时使用哪种格式取决于ContentType。CXF 默认返回的是JSON 字符串。
2.访问方法URI 是/student/1/info name=Andrew-Lee、/student/1/info2 name=Fetion,由@Path
注解组合而来;
3.@QueryParam 注解用于指定将URL 上的查询参数传递给使用这个注解的属性值;
4.@PathParam 注解用于指定将URL 上的路径参数作为使用这个注解的属性值。
5.@GET 注解指定方法对应于Http 的GET 请求。JAX-RS 提供javax.ws.rs.HttpMethod 注解
允许你增加除了@GET 等之外的方法,例如:你想定义一个新的HTTP 方法@PATCH,你
可以这样像下面这样编写代码:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("PATCH")
public @interface PATCH {
}
但你要注意,你新增加的这个方法,Web 服务器一定要支持才可以,如果不支持,你就需要配置你的Web 服务器,譬如上面定义的@PATCH 注解指定的PATCH 方法在标准的Http方法中根本就不存在。
6. 跟@pathparam不同,@queryparam中,指定的是URL中的参数是以键值对的形式出现的,而在程序中
@QueryParam("from") int from则读出URL中from的值, 而@pathparem中,URL中只出现参数的值,不出现键值对,比如: “/users/2011/06/30”
package JAXRS;
import java.text.ParseExcept