使用 Rails Active Resource 简化 web 应用程序之间的互操作性
2012-08-10 20:22
495 查看
使用 Rails Active Resource 简化 web 应用程序之间的互操作性
采用 RESTful 方法Saideep Annadatha, 软件工程师, IBM
简介: 了解使用 Ruby on Rails 的 Active Resource 来实现和使用 web 服务的一种快速简便的方法。通过一种 RESTful 方法,Rails 帮助您简化您的 web 应用程序之间的互操作性。本文将通过一些示例逐步展示 Active Resource 的操作。您还将探索 REST 和 SOAP 之间的区别。
本文的标签: web_服务, xml, 应用集成, 集成架构
标记本文!
发布日期: 2011 年 6 月 01 日
级别: 初级
原创语言: 英文
访问情况 : 1944 次浏览
评论: 0 (查看 | 添加评论 -
登录)
平均分 (0个评分)
为本文评分
简介
当今的应用程序不仅需要和基于浏览器的客户端互操作,还需要和其他应用程序互操作。为实现互操作性,web 应用程序通常提供一个 web 服务 API。web 服务 API 通过一个网络(比如 Internet)提供对应用程序 的远程访问。直到最近,web 服务 API 还使用重型、复杂的基于 SOAP 的 web 服务集成,这种 web 服务,不仅没有什么优点,而且还需要很长时间才能实现。带有基于 Representational State Transfer (REST) 服务的 Rails 框架有一种更简单、更快捷的方法通过
Active Resource 来实现和使用 web 服务。
在 Rails 实现了 RESTful 以后,现在只需通过一个 Rails 动作就能提供一个特定资源的不同内容类型(或者表示)。这种方法有以下好处:
一个资源的各种表示状态。
对不基于浏览器的 HTML 客户端的附加支持在 Controller 视图中得到了简化。
应用程序之间以及与新客户端之间的互操作性。
在本文中,您将了解 REST、SOAP、Rails Active Resource,以及如何提高多个应用程序之间的互操作性。
回页首
Ruby on Rails
Ruby on Rails(也称为 Rails 或 RoR)是一个用 Ruby 语言编写的开源 web 应用程序框架。Ruby on Rails 旨在帮助开发人员更轻松快捷地开发和部署 web 应用程序,与其他语言和框架相比,Rails 框架进行了几个假设。其目的是使用敏捷开发的方法,实现快速开发。
Rails 框架合并了以下几个包:
Active Record:一个对象关系映射层,用于数据库相关访问和功能;
Action Pack:一个控制器和视图功能管理器;
Action Mailer:一个电子邮件处理器;
Active Support
Active Resource:提供 web 服务(即 Action Web 服务)。
回页首
Web 服务
Web 服务是使用开放协议通信的应用程序组件,它们可以被其他应用程序使用。web 服务是简单 APIs ,可以使用 HTML 进行访问,并在承载请求服务的远程系统上执行。web 服务是不同平台上、以不同语言编写、不同系统上的各种应用程序的关键集成点。
REST 不是一个协议;它是利用 World Wide Web 的技术和协议的大型联网软件的一种架构风格。REST 描述如何定义和处理分布式数据对象(或资源),强调简单的信息交换和可伸缩性。REST 架构描述该该架构上应用的 6 个约束。
另一方面,SOAP 是一个协议规范,用于在计算机网络中交换 web 服务的实现中的结构化信息。它依赖 XML 作为其消息格式,通常依赖其他应用程序层协议(RPC 和 HTTP)进行消息协商和传输。SOAP 可以形成 web 服务协议堆栈的基础层,提供用于在其上构建 web 服务的基础消息传递框架。
REST 与 SOAP
下表展示了 REST 和 SOAP 之间的一些区别。
REST | SOAP |
---|---|
不是协议 | 是协议 |
是创建 web 服务的方法的发展趋势 | 旧方法;主要应用程序已使用 SOAP 来构建与其他应用程序的通信和互操作性。 |
架构:关键资源已确定;它们可能是实体、集合或者其他似乎值得拥有自己的 URI 的对象。标准方法(HTTP 动词)已映射到特定于资源的语义。所有资源都实现相同的统一接口。内容类型的维度支持一个资源的不同表示(例如,XML、HTML、以及纯文本),并允许链接资源表示中的资源。 | 架构:针对消息格式、消息交换模式(MEP)、底层传输协议绑定、消息处理模型以及协议可扩展性的几个规范层。主要用于企业应用程序集成各种类型的应用程序。另一个趋势是集成旧系统。 |
使用 URI 这个非常知名且广泛使用的接口来编写 web 服务的方法系统的关键。任何拥有 HTTP 支持的客户端和服务器应用程序都能使用一个 HTTP GET 命令来轻松调用服务。 根据脚本编写的方式,生成的 HTTP 响应可能非常简单,比如只包含几个标准头部和一个文本字符串,该字符串包含给定符号的当前价格。后者,它可能是一个 XML 文档。与基于 SOAP 的服务相比,这个接口方法拥有巨大的优势。 | 提供相对较强的类型化能力,因为它拥有一组固定的支持数据类型。SOAP 保证,返回值将以一个特定平台中的对应原生类型直接可用。 通过基于 HTTP 的 API,返回值需要从 XML 反序列化,然后再设置类型。 |
请求和响应可以比较短。 | 每个请求和响应都需要一个 XML 包装器。一旦名称空间和类型被声明,SOAP 中的一个 4 或 5 位股票报价需要的类型数可能是 REST 中的相同响应的 10 多倍。 |
基于 HTTP 的 RESTful API 可以通过简单的 GET 请求来使用。中间代理服务器和反向代理能够轻松缓存它们的响应。 通过坚持简单的语义规模,REST 能够利用客户端和服务器之间的所有缓存级别。 | 请求使用 POST 且需要创建一个复杂的 XML 请求,这使得响应缓存难以实现。 |
REST 支持者指出,使用 SOAP 协议直接访问远程程序的功能必定会遇到 DCOM 和 Common Object Request Broker Architecture 等之前分布式计算架构所遇到的互操作性问题。
回页首
Active Resource
在对 web 应用程序在服务器和客户机应用程序之间的通信采用 RESTful 方法之前,SOAP 和其他 XML-RPC 形式被用于通过一个 API 进行通信。Rails 2 引入的 Active Resource 替代了 Action Web Service。Active Resource 完全理解 RESTful 路由和 XML 表示。它是一个类,用于将 RESTful 资源映射为 Rails 应用程序中的模型。Active Resource 提供一些工具来快速、轻松地使用遵守 Rails RESTful
URI 结构和协议约定的基于 REST 的 web 服务。Active Resource 将来自任何合格服务的响应映射到富 Ruby 对象。Active Resource 还提供轻松执行基本的 CRUD 功能需要的全部生命周期方法。
CRUD 操作分别对应 HTTP 方法 POST、GET、PUT 和 DELETE。而且,Active Resource 对这些 HTTP 方法中的每个方法都有一个方法。它们接收与 CRUD 相同的参数,但返回收到的 XML 的一个哈希表。Active Resource 对象本质上是 REST web 服务器的前端。它通过向服务器回调 HTTP 调用并将 XML 结果解析回一个 Ruby 对象中来获取并修改它的数据。
清单 1 展示了一个最小 Active Resource 示例。假设有一个图书馆应用程序,每个类别作为一个不同的客户端,且 Indian History 是其中一个类别。
清单 1. Active Resource 示例
class IndianHistory < ActiveResource::Base self.site = “[code]http://indian-history.com” end [/code] |
ActiveResource拥有与 Active Record 相同的方法。在上面的代码样例中,类
IndianHistory正继承自
ActiveResourceBase。在第二行中,
self.site持有包含
IndianHistory 图书的 URI 的站点值。在本例中,这个 URI 是
http://indian-history.com(假设这个 URI 是带有必要模型和控制器动作的另一个 Rails 应用程序)。
现在,这个类被映射到站点值定位的 RESTful 资源,您现在可以操作
IndianHistory类的资源。要获取 Indian History 下的所有图书列表,您将调用它的 find 方法,它类似于 Active Record find 方法。
>> books = IndianHistory.find (:all) |
假设您正在寻找标题为 “Akbar” 的图书,可以使用以下代码:
>> books = IndianHistory.find(:all, :params => { :title => “Akbar”}} |
:params,且 URL 是 GET http://indian-history.com/indian_histories.xml?title=Akbar。
Active Resource 不仅限于检索数据。您可以使用所有 CRUD 操作。在脚本/控制台中,您可以使用:
>> IndianHistory.create (:title => “Jhansi Stories”, :amount => 233.00, :available => 0) |
create动作中存在清单 2 中的代码的控制器创建一个 HTTP POST。
清单 2. Create
class IndianHistoryController < ActiveResource::Base def create @book = IndianHistory.new (params [:indian_history]) respond_to do |format| if @book.save flash[:notice] = “New title added successfully” format.html { redirect_to(@book) } format.xml { render :xml => @book, :status => :created} else format.html { render :action => “new” } format.xml { render :xml => @book.errors, :status => :unprocessable_entity} end end end end |
同样,您也可以更新和删除记录,主要您拥有执行管理的权限和访问权。
对于 Update 操作,在脚本/控制台中使用:
清单 3. Update
>> book= IndianHistory.find (2) >> book.available = 1 >> book.save >> book = IndianHistory.find (2) >> book.available # => 1 |
ActiveResource和
ActiveRecord之间有一个细微差别:
ActiveResource中没有方法 save 和 update。
最后,下面的语句将从数据库移除记录。
>> IndianHistory.delete(2) |
回页首
结束语
在本文中,您了解了 web 服务、REST、SOAP 和 Rails Active Resource。一个简单的示例向您展示了 CRUD 操作。
Ruby on Rails Active Resource 包以一种 RESTful 方式提供多个 web 应用程序之间的轻松通信。除了 CRUD 操作外,它还允许您创建自定义动作。
参考资料
学习
进一步了解 Rails API。
复习基本和高级 Rails 教程和播客。
Programming Ruby 1.9: The Pragmatic Programmers' Guide (Facets of Ruby),作者
Thomas、Fowler 和 Hunt,这是 Ruby 的参考手册,包括所有标准库模块的一个描述和所有内置类和模块的一个完整参考,其中包括 Ruby 1.9 引入的所有新方法和更改的方法。
The Rails Way,作者 Obie Fernandez,这是使用 Rails 构建生产质量的软件的一个综合、权威指南。
developerWorks 的 developerWorks 中国网站 Web 开发专区 专门提供关于各种 Web 解决方案的文章。
developerWorks Ajax 资源中心:这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。
developerWorks Web 2.0 资源中心,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过 Web
2.0 新手入门 栏目,迅速了解 Web 2.0 的相关概念。
访问 developerWorks developerWorks 中国网站开源技术专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。
获得产品和技术
获取 最新 Rails 代码。
下载 IBM 产品评估试用版软件 或 IBM SOA 人员沙箱,并开始使用来自 DB2®、Lotus®、Rational®、Tivoli®
和 WebSphere® 的应用程序开发工具和中间件产品。
讨论
在 Google 上关注非常活跃的 Ruby on rails 论坛。
参与 developerWorks 博客 并加入 developerWorks 社区。
现在就创建您的 developerWorks 个人档案 并设置一个关于混搭的 关注清单。连接到 developerWorks 并保持连接。
找到 对 web 开发感兴趣的其他 developerWorks 成员。
Web 开发人员,请在 web 开发群组中分享您的经验和知识。
分享您的知识:加入一个关注 web 主题的 developerWorks 群组。
Roland Barcia 撰写的关于 Web 2.0 和中间件 的博客。
关注 developerWorks 成员 关于 web 主题的共享书签。
快速找到答案:访问 Web 2.0 Apps 论坛。
快速找到答案:访问 Ajax 论坛。
关于作者
Saideep Annadatha 目前是 IBM 印度软件实验室的 TXSeries(分布式平台上的事务处理中间件)质量保证团队的成员,负责 Inter System Communication (ISC) 领域。此前,他参与了几个基于 Rails 的项目。除 Ruby on Rails 外,他的兴趣还包括 Python 和 C。
相关文章推荐
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 使用 Ruby on Rails 快速开发 Web 应用程序
- 通过 Rails 在 Web 应用程序中使用 Ajax
- JavaScript使用面向对象的技术创建高级 Web 应用程序
- [转载] 使用 Java Web Start 部署 SWT 应用程序
- 使用Websharp Service Locator简化分布式系统开发
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例
- 使用netlink机制在内核与应用程序之间通信
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
- JSF 和 Ajax:使用 Rational Application Developer V7 轻松实现 Web 2.0 应用程序
- JavaScript使用面向对象的技术创建高级 Web 应用程序
- 使用 Microsoft SQL Server 2000 的全文搜索功能构建 Web 搜索应用程序
- 构建富Internet应用程序 :使用OpenLaszlo、Eclipse Laszlo IDE和Web Tools
- javascript使用面向对象的技术创建高级 Web 应用程序