1、REST基础及实例开发REST基础及实例开发黄晓娜2011-11-22REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释) 理解出错处 REST基础及实例开发 REST (Representation State Transfer:表述性状态转移) 描述了一个架构样式的网络系统,比如 web 应用程序。 REST从资源的角度来描述整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这
2、些特征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变这其状态,也即所谓的表述状态转移。 REST是设计风格。它通常基于使用HTTP,URI,和XML以及HTML这些现有的协议和标准。 REST指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。注意:REST中的资源指的不是数据,而是数据和表现形式的组合,比如“访问次数”和“下载次数”在数据上可能有重叠或者完全相同,而由于他们的表现形式不同,所以被归为不同的资源REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架
3、实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发 网络上的所有事物都被抽象为资源-应用程序对象、数据库记录、算法等。 每个资源对应一个唯一的资源标识符(URI)。 通过通用的连接器接口(GET,PUT,POST,DELETE)对资源进行操作。 对资源的各种操作不会改变资源标识符。 所有操作都是无状态的。每个HTTP请求都是孤立的,每个请求都必须包含自己的参数来完成操作。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客
4、户端可以缓存数据以改进性能。 分层系统:组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。REST 设计原则包括客户-服务器、无状态、缓存、统一接口、分层系统等。REST 原则的无状态指服务器端不保存客户应用状态,连接请求响应断开,客户的上一次请求与下一个请求没有关系。服务器端响应客户请求返回资源的表述及相关链接,该表述的本身就是客户的当前状态,客户按照表述中提供的链接选择下一个表述,迁移到下一个状态。也就是服务器通过表述为状态迁移提供指导,而状态的迁移权掌控在用户手里,客户根据自己的需要选择链接,由当前状态迁移到下一个状态。R
5、EST基础及实例开发 HTTP请求方法在RESTful web中的应用资源资源GETPUTPOSTDELETE一组资源的URI,比如http:/ URI,以及该资源组中每个资源的详细信息(后者可选)可缓存,幂等使用给定的一组资源替换替换当前整组资源。在本组资源中创建创建/追加追加一个新的资源。 该操作往往返回新资源的URI。不缓存,不幂等删除删除 整组资源。单个资源的URI,比如http:/ 指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等)替换替换/创建创建 指定的资源。并将其追加到相应的资源组中。只有在客户端能够决定资源的URI时才能使用把指定的资源当做一
6、个资源组,并在其下创建创建/追加追加一个新的元素,使其隶属于当前资源。删除删除 指定的元素。REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发 分析用例,找到可以“创建”、“读取”、“更新”或“删除”动作来操作的领域名词,每个领域名词都可标识为资源。使用POST,GET,DELETE,PUT对其进行操作。 某些情况下,例如:生成随机数;为客户端提供一个方法,在一个请求中,获取最小属
7、性集的用户档案;列出最近10张用户上传的照片;将钱从一个银行账户转到另一个银行账户(转账)等。可以识别出名词但是如果将这些名词设别为资源,会发现相应的动作没有办法映射到HTTP方法上。这是需要额外的资源来处理这些用例。REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发 Restlet:由erome Louvel 和 Dave Pawson 开发,它实现针对各种 RESTful 系统
8、的资源、表示、连接器和媒体类型之类的概念,包括 Web 服务。在 Restlet 框架中,客户端和服务器都是组件。组件通过连接器互相通信。 JSR-311是 Sun Microsystems 的规范,可以为开发 RESTful Web 服务定义一组 Java API。Jersey是对 JSR-311 的参考实现。 uJSR-311 提供一组注释,相关类和接口都可以用来将 Java 对象作为 Web 资源展示。该规范假定 HTTP 是底层网络协议。它使用注释提供 URI 和相应资源类之间的清晰映射,以及 HTTP 方法与 Java 对象方法之间的映射。API 支持广泛的 HTTP 实体内容类型,
9、包括 HTML、XML、JSON、GIF、JPG 等。它还将提供所需的插件功能,以允许使用标准方法通过应用程序添加其他类型。 REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI)理解出错处 REST基础及实例开发 安装JDK,Tomcat并配置变量。 安装Eclipse或MyEclipse 在Jersey官网上下载所需的jar包 Jersey框架所依赖的包客户端解析JSON所需的包REST基础及实例开发REST基础uREST概念uRE
10、ST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发 在Myeclipse开发环境中创建一个Java Web工程。添加jar包到web工程的类路径 u 直接添加,把jar包copy到WebRoot/WEB-INF/libu 在工程的根目录下创建lib文件夹,copy jar包到lib, 配置Build-path REST基础及实例开发 REST基础及实例开发 OKOKREST基础及实例开发转账业务应用场景:当用户输入贷款账户(LoanA
11、ccountid),借款账户(Borrowerid)和借款金额( LoanAmounts )后,点击转账,客户端调用服务端的转账资源,修改CustomerAccount表,使贷款账户余额减少LoanAmounts,借款账户月增加LoanAmounts。 Web工程结构 AccountService代码 CustomerAccount代码Javabean文件,其与数据库表结构对应,用于封装数据对象,以便在服务端和数据端传送数据REST基础及实例开发 修改配置文件web.xmlcom.sun.jersey.spi.container.servlet.ServletContainercom.sun.
12、jersey.config.property.packagesaccount.service1/accountres/* 资源文件所在的包名RestfulContainerRestfulContainer访问资源基路径REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)存在问题迷惑 REST基础及实例开发 部署 REST基础及实例开发 点击“Finish”,启动tomcat REST基础及实例开发REST基础uRES
13、T概念uREST设计原则 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI)理解出错处 REST基础及实例开发 可以在AOM,Flex,Myeclipse下开发restful web的客户端访问应用程序 客户端应用程序通过Jersey提供的jersey-client.jar与服务端通信 部分代码/ 定义一个客户端Client c=Client.create();/ 获取指定URI下资源WebResource r=c.resource(http:/192.168.0.99:8080/transiation1/ac
14、countres/account/tran);/ 定义一个MultivalueMap存储参数MultivaluedMap queryParams = new MultivaluedMapImpl();queryParams.add(loanAccountid,fromid);queryParams.add(loanAmounts, num);queryParams.add(borrowerid, toid);ClientResponse response=r.get(ClientResponse.class);System.out.println(r.queryParams(queryPara
15、ms).get(String.class); REST基础及实例开发 访问客户端( http:/127.0.0.1:6888/RestfulClient/restful.faces )REST基础及实例开发REST基础uREST概念uREST设计原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发 动态创建URI:在REST中的POST中,创建一个具有唯一URI的资源,当此资源创建成功后,就可以通过此URI访问该资源。 Example:创建一个
16、添加用户的页面,并把用户的ID作为访问此用户URI的一部分。 用户在浏览器上输入http:/localhost:8080/Example/rest/contacts,并输入ID,Name点击“submit”如下所示:REST基础及实例开发 用户在浏览器上输入http:/localhost:8080/Example/rest/contacts/0001, 将会调用GET方法把ID为0001的信息以XML或JSON的形式显示,如下:REST基础及实例开发 具体实现u REST提供了context注释,可以引入上下文对象( Request、Response、UriInfo、ServletContex
17、t )u 此例子中使用UriInfo类的方法创建URIPOSTProduces(MediaType.TEXT_HTML)Consumes(MediaType.APPLICATION_FORM_URLENCODED)public void newContact(FormParam(id) String id,FormParam(name) String name,Context HttpServletResponse servletResponse) throws IOException URI uri = uriInfo.getAbsolutePathBuilder().path(id).bu
18、ild();Response.created(uri).build();u 详细代码u HTML页面脚本REST基础及实例开发 REST常用注释u Path:与根路径结合形成子资源的URIu PathParam:将参数注入参数的路径u QueryParam:普通参数传递u FormParam:表明此参数从HTML属性确定的表单输入u Produces:响应支持MediaType类型,表示服务端返回到客户端的参数类型u Consumes:响应支持MediaType类型,表示客户端传递到服务端的参数类型u Context:引入上下文对象REST基础及实例开发REST基础uREST概念uREST设计
19、原则u资源的识别 Restful Web服务的java框架实例开发(转账业务)u环境准备u 服务端开发u服务部署u 客户端访问u 补充(动态创建URI及REST常用注释)理解出错处 REST基础及实例开发针对于POST和GET的理解不够透彻,通过查阅资料可知这几个动词的操作对象是资源集合,但是可以为GET指定一个path(URI),并创建资源(在GET对应的方法中写一段代码实现某一个功能)例如:GET Path (“add) Produces(MediaType.TEXT_PLAIN)Consumes(MediaType.TEXT_PLAIN) public String add(QueryP
20、aram(num1) DefaultValue(1) String num1, QueryParam(num2) DefaultValue(2) String num2) float result=Float.parseFloat(num1)+Float.parseFloat(num2);return String.valueOf(result); 实现一个加法运算。上面的实现的加法运算很明显是一个资源的创建过程,而非资源的查找。这样做是不是违背了REST的设计原则?NO!REST基础及实例开发 对于一些处理函数,算法,应用程序,可以把它们自身视为资源,在REST中称为抽象资源。 以上求两个数
21、和的函数可以把其作为一个资源,其计算结果(两个数的和)可以作为此资源的一个表述;此外,例如计算两地的距离算法,可以把计算距离算法作为一个资源,而距离只是它的一个表述。 以上处理函数都要求幂等性,所以GET是最适合实现处理函数的HTTP方法。对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器端用Request.Form获取提交的数据。 GET是把参数数据队列加到提交表单的ACTION属性所指的URL,值和表单内各个字段意义对应在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程REST基础及实例开发Thank You!