基于Jersey框架的RESTful Web Service的研究与实现.doc

上传人:gs****r 文档编号:1611086 上传时间:2019-03-08 格式:DOC 页数:13 大小:63.50KB
下载 相关 举报
基于Jersey框架的RESTful Web Service的研究与实现.doc_第1页
第1页 / 共13页
基于Jersey框架的RESTful Web Service的研究与实现.doc_第2页
第2页 / 共13页
基于Jersey框架的RESTful Web Service的研究与实现.doc_第3页
第3页 / 共13页
基于Jersey框架的RESTful Web Service的研究与实现.doc_第4页
第4页 / 共13页
基于Jersey框架的RESTful Web Service的研究与实现.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、基于 Jersey 框架的 RESTful Web Service 的研究与实现摘 要日益复杂的异构环境对 Web 服务提出了更高的要求。相比于 RPC 和 SOAP,更为简洁的、轻量级的 RESTful Web Service 获得了越来越广泛的关注。文章简要阐述了 REST 风格及其规范 JAX-RS,提出一种利用 Jersey 框架对其实现的方式。研究利用 JQuery AJAX 技术处理GET、POST、PUT、DELETE 请求,采用 CORS 方案解决跨域访问问题,使用JSON 封装数据以提高异构平台间数据的一致性及处理效率。实践证明,该方法具有其有效性和先进性。 关键词Jerse

2、y RESTful Web Service JSON Android JAX-RS 中图分类号:TP393.09 文献标识码:A 文章编号:1009-914X(2016)02-0361-03 1 REST、JAX-RS 与 Jersey 简介 REST 最初是 2000 年 Roy Thomas Fielding 在他的博士论文Architectural Styles and the Design of Networkbased Software Arehitectures2中提出的,是针对分布式系统的软件架构风格。然而事实上,REST 并不是一个全新的概念,它其实也是 HTTP1.1 协议的

3、设计原则3。它是使用 HTTP 协议的语法和语义将其功能完全作为一组 URI 可寻址资源来向服务消费者提供的 Web Services 架构方式4。在 REST 风格中,资源是最关键的概念,任何可以被访问或被远程操纵的东西都可能是一个资源。REST 充分利用 HTTP 的自身功能,使用其标准的?GET、POST、PUT、DELETE?四种请求完成资源的 CRUD 操作,即新增(Create) 、读取(Read) 、修改(Update)和删除(Delete) 。它使得Web 服务的开发回归到 HTTP 本质,从而降低开发的复杂性,使得开发更加简洁而高效。而满足 REST 风格的设计就称之为 RE

4、STful。 REST 虽然十多年前就已被提出,但其相关规范直到 2008 年才被正式批准,这就是 JAX-RS (Java API for RESTful Web Services , JSR 311) 。JAX-RS 规范是 Sun 公司(现为 Oracle 公司)Java 企业版(JEE)开源实现的规范的一部分。JAX-RS 通过提供一个带有注释机制的 API 把普通 Java 类和接口联系起来,采用一种特殊的资源描述方式为 RESTful Web 服务建立一个资源类5。它集成了 JAXB,通过其注释机制大大简化了 RESTful Web Service 的开发,有效缩短了其开发周期。

5、目前,遵从 JAX-RS 规范实现 RESTful Web Service 的框架很多,例如 Jersey、Apache CXF、RESTEasy、RESTlet、Apache Wink 等。然而,这并不是必须的。事实上,Spring MVC 3.0 就是按照其自定义的方式来实现 RESTful Web Service 的。在众多实现框架中,Jersey 是 Sun 公司伴随着 JAX-RS 规范同步发布的一个参考实现项目,能对 JAX-RS 规范提供良好支持,更加直观,具有代表性。然而截止目前,相比于 rails 等其他框架,国内外关于 Jersey 框架的文献参考少之又少。文章对于弥补该方

6、面的空白具有一定价值。 2 总体设计 系统由应用层、资源层、服务层和数据访问层这四层自上而下组成,结构如图 1 所示。 应用层(Application Layer)位于客户端,可以是 Web 浏览器或Android 手机等终端。该层负责接收用户的输入数据,并向服务端的资源层发送资源请求,同时能向用户展示结果视图。 资源层(Resource Layer)处理应用层发送的 HTTP 请求,根据请求类型调用服务层的不同方法,并向应用层返回 JSON 等格式数据。用户便是通过该层提供的 URI 来请求资源的。 服务层(Service Layer)则是系统功能的核心,执行各种业务逻辑以完成系统各项功能。

7、它通过与数据层的通信获取需要的数据,然后通过加工处理,向资源层提供具体服务。 数据层(Data Layer)利用 DAO 封装与具体业务逻辑无关的 CRUD 操作,从底层数据库获取相应数据并返回给服务层。 REST 风格的核心概念是资源,而 URI 则是访问资源的关键,设计良好的、统一规范的 URI 十分必要。下表 1 是对应四类资源的部分 URI 举例。限于篇幅,URI 的设计原则此处不做介绍。 3 RESTful Web Service 服务端实现 服务端代码由 5 个包组成,dao、service 和 resource 包分别用于实现数据层、服务层和资源层。除此之外,pojo 包专用于存

8、放POJO,filter 包则用于存放过滤器。 3.1 POJO 类 在 com.rest.pojo 包中建立 POJO 类:Customer。POJO 类使用 XmlRootElement 注释,以便将 bean 以 xml 或 json 格式返回。具体如下: XmlRootElement public class Customer private String id; private String name; private String addr; getters and setters 3.2 DAO 类 在 com.rest.dao 包中建立 CustomerDAO 类,该包位于数据

9、层,实现与业务逻辑无关的数据库 CRUD 操作。研究使用 MySql 数据库,利用 JDBC实现数据库连接与访问。例如下述代码便是利用 JDBC 提供的 Connection等对象实现了数据的增删改操作。 /该方法与业务逻辑无关,只要是关于数据库的增删改操作均能适用 static public int noQueryDB(String sql) Connection conn=dbConnection() ; /用自定义方法实现数据库连接 Statement stmt=createStatement(conn) ; /用自定义方法实例化 Statement 对象 int count=stmt.

10、executeUpdate(sql) ; return count; /返回实际影响的行数 3.3 Service 类 在 com.rest.service 包中建立 CustomerService 类,该包位于服务层。CustomerService 类对应用层传递的数据进行逻辑加工,然后通过与数据层的通信获取需要的结果,再对结果进行处理返回给应用层。下述为更新一个 customer 的服务代码。为集中介绍 Jersey 框架实现,此处省略与之无关的业务处理。 /从应用层获取 customer 对象,并返回影响的行数 public int updateCustomer(Customer cus

11、tomer) String sql=“update customer set name=“ + customer.getName() + “,addr=“ + customer.getAddr() + “ where id=“ + customer.getId() + “; int count=CustomerDAO.noQueryDB(sql) ; return count; 3.4 Resource 类 在 com.rest.resource 包中建立 Customers 类,该类位于资源层。Jersey 框架支持 JAX-RS 规范,采用一系列符号开头的注释描述资源。限于篇幅,仅介绍更新

12、某 id 的 customer 资源,无关操作省略,代码如下。 public class Customers private CustomerService customerService = new CustomerService () ; getter and setter PUT /用于更新操作的 PUT 请求,对于同样的 URI,可 /根据该注释进行路由选择,调用不同的方法 Path(“customers /id“) /定义资源的 URI 路径 Produces(“application/json;charset=UTF-8“) /定义请求的MIME 格式为 JSON Consumes

13、(“application/json;charset=UTF-8“) /定义响应的MIME 格式为 JSON /注释PathParam 表示路径参数,可以将请求的 URI 中的一部分作为参数传入方法 public Customer updateCustomer(PathParam (“id“) String id, Customer customer) Customer cust = (Customer) getCustomerService().getCustomerById(id) ; if (cust = null) throw new WebApplicationException(R

14、esponse.status(Status.NOT_FOUND).build() ) ; else getCustomerService().updateCustomer(customer) ; return customer; 客户端与服务器的数据交换可以采取多种 MIME 格式,但在 web 应用中,人们常采用 XML 或 JSON。因为两者都能较好地实现跨平台、跨系统交换数据。为统一数据格式,简化接口设计,XML 和 JSON 成为数据交换的首选格式。然而,XML 格式文件存储了大量的冗余信息,相对于 JSON格式的文件需要占用更多的带宽。其次,对其进行解析相比 JSON 格式的文件更复

15、杂6。因此,研究采用更为轻量级的 JSON 数据格式。在上述资源类中通过注释Produces 和Consumes 进行了声明。 另外,在上述 updateCustomer 方法中可以看出,资源层能直接使用customer 对象接收应用层传递来的 JSON 数据。这便是 JAXB 的XmlRootElement 注释的作用。JAX-RS 集成了 JAXB,能自动实现 JSON 数据与 bean 的相互转换,为数据传递提供了便捷手段。 4 Web 客户端实现 虽然 HTTP 支持GET、POST、PUT、DELETE、OPTIONS、HEAD、TRACE、CONNECT 八种请求方式,但目前流行的

16、 Web 浏览器大多只支持其中的 GET 和 POST 方法。所以Rails 采用一个虚拟的:method 参数来模拟 HTTP 中的 PUT 和 DELETE 方法7。事实上,REST 只是一种风格,怎样实现并没有统一规范。甚至直接将方法写在资源的 URI 中以区别四种请求也是允许的。不过这样的设计将简单的问题复杂化了,有违 REST 风格的设计初衷。文章则利用JQuery AJAX 技术来提交 GET、POST、PUT、DELETE 请求。 下面代码用于提交 PUT 请求,以访问更新某 id 的 customer 资源。 $.ajax( url: http:/127.0.0.1:8080/

17、RestDemo/customers/+$(“#id“).val() ,type: put, /指明数据提交方式为 PUT,对应的操作是更新 data: JSON.stringify(GetJsonData() ) , /自定义方法GetJsonData 用于从 Web 页面获取需提交的数据, /并整理为 JSON 格式 dataType: json, /服务器返回的数据类型 contentType:application/json, ) ; 然而此时请求资源还涉及跨域访问问题。解决跨域访问的方法也很多,研究采用非常简单的且被众多浏览器良好支持的 CORS 方法。为使代码分离,研究创建过滤器

18、CorsFilter,在过滤器中进行访问权限的控制。具体做法是重写 CorsFilter 的父类 Filter 中的方法 doFilter,在其中加入如下代码即可: resp.setHeader(“Access-Control-Allow-Origin“, “*“) ; resp.setHeader(“Access-Control-Allow-Methods“, “POST, GET, PUT, DELETE, OPTIONS“) ; “Access-Control-Allow-Origin”表示允许访问的外部资源, “*”表示所有允许任何域进行访问。 “Access-Control-Allo

19、w-Methods”则表示允许访问的方法类型。 如此,以 PUT 方式访问URI:http:/127.0.0.1:8080/RestDemo/customers/1,可实现 id 为1 的 customer 的更新。 由于研究涉及了跨域访问,因此在向服务器发送 PUT 请求前,客户端会首先发起 OPTIONS 请求。当服务端验证通过后,然后再正式发送 PUT请求。节录 PUT 标头信息如下所示。 (1)PUT 请求头: PUT /RESTDemo/customers/1 HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Accept: a

20、pplication/json, text/javascript, */*; q=0.01 Origin: http:/127.0.0.1:81 Content-Type: application/json Referer: http:/127.0.0.1:81/webclient/updatecustomer.html (2)PUT 返回头: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, PUT, DELETE,

21、 OPTIONS Access-Control-Allow-Headers: Content-Type, Accept, X-Requested-With Content-Type: application/json;charset=UTF-8 5 Android 客户端实现 Android 利用 HTTP 访问网络资源的方式主要有两种,一种是使用HttpURLConnection,另一种是使用 Apache HttpClient。然而 Android从 4.3 开始取消了对 HttpClient 对象的支持。研究使用HttpURLConnection 向服务端发送请求。限于篇幅,在 Andr

22、oid 客户端,文章也仅介绍如何发送 PUT 请求。 首先创建一个线程,用于更新客户信息,然后重写 run 方法,代码如下。 URL url = new URL(“http:/192.168.1.108:8080/RestDemo/customers/“+etId.getText() ) ; HttpURLConnection connection = (HttpURLConnection) url.openConnection() ; String content=getContentToJson(etId.getText() ,etName.getText() ,etAddr.getText() ) ; connection.setDoOutput(true) ; /设置容许输出

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。