使用Jersey创建RESTful服务

来源:互联网 发布:个人cn域名备案 编辑:程序博客网 时间:2024/04/29 13:52

Dropwizard用Jersey实现RESTful架构。

一、REST基础概念

首先REST是 Representational State Transfer 的缩写,如果一个架构符合REST原则,它就是RESTful架构。

在REST中的一切都被认为是一种资源。所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。

所谓"上网",就是与互联网上一系列的"资源"互动,调用它的URI。

我们把"资源"具体呈现出来的形式,叫做它的 表现层(Representation) 。

比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。

URI只代表资源的实体,不代表它的 形式 。URI只代表资源的 位置 。它的具体表现形式,应该在HTTP请求的头信息中用 Accept 和 Content-Type 字段指定,这两个字段才是对"表现层"的描述。

客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。

互联网通信协议HTTP协议,是一个 无状态协议 。这意味着,所有的状态都保存在 服务器端 。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生状态转化 (State Transfer)。而这种转化是建立在表现层之上的,所以就是 表现层状态转化 。

客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。

二、Jersey RESTful

Jersey RESTful 框架是开源的RESTful框架, 实现了 JAX-RS 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。

尽管相对年轻,它已经是一个产品级的 RESTful service 和 client 框架。

下面介绍使用Maven与Jersey编写一个简单的RestFul服务的栗子。

1.加入Maven包依赖

2.在Web.xml文件中定义Servlet调度程序

3.创建资源文件

资源是Rest中最重要的部分,可以通过Http的方法 GET、POST、PUT 和DELETE等对资源进行增删改查,下面创建的 UserResource 中实现了对User的增删改查,用户存储在 UserCache 的一个Map中,在 JAX-RX 中,资源通过 POJO 实现,使用 @Path 注释组成其标识符。资源可以有子资源。在这种情况下,父资源是资源集合,子资源是成员资源。

1.增加一个User

注解 @Path("/users") 将 UserResource 暴露为一个Rest服务,注解 @POST 将HTTP方法映射到资源的 让POST方法变成创建方法。

  1. @Consumes:声明该方法使用 HTML FORM即表单输入。
  2. @FormParam:注入该方法的 HTML 属性确定的表单输入。
  3. @Response.created(uri).build(): 构建新的 URI 用于新创建的User(/users/{id})并设置响应代码(201/created)。
  4. @Produces:限定响应内容的 MIME 类型。MIME类型有很多种,XML和JSON是常用的两种
  5. @Context: 使用该注释注入上下文对象,比如 Request、Response、UriInfo、ServletContext 等。

2.删除用户

@DELETE将Http Delete请求绑定到删除用户(资源)操作上。@PathParam该注释将参数注入方法参数的路径

3.更新用户

根据用户的Id来更新一个用户(资源)。

Consume XML:putContact() 方法接受 APPLICATION/XML 请求类型,而这种输入 XML 将使用 JAXB 绑定到 User 对象。

PUT 请求的响应没有任何内容,但是有不同的状态码。如果Cache中存在联系人,我将更新该User并返回 204/no content。如果没有User,我将创建一个并返回 201/created。

4.查找用户

根据传入的id查找用户,如果没有用户则抛出异常。

返回类型为 MediaType.APPLICATION_XML 需要在JavaBean中设置 @XmlRootElement 注解。


0 0
原创粉丝点击