首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Rails Active Resource 简化 web 应用程序之间的互操作性(2)

使用 Rails Active Resource 简化 web 应用程序之间的互操作性(2)

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 示例
1
2
3
class IndianHistory < ActiveResource::Base
self.site = “<a href="http://indian-history.com/"><code>http://indian-history.com</code></a>”
end




ActiveResource 拥有与 Active                Record 相同的方法。在上面的代码样例中,类 IndianHistory 正继承自 ActiveResource Base。在第二行中,self.site 持有包含 IndianHistory 图书的 URI 的站点值。在本例中,这个 URI 是 http://indian-history.com(假设这个 URI 是带有必要模型和控制器动作的另一个 Rails 应用程序)。               
现在,这个类被映射到站点值定位的 RESTful 资源,您现在可以操作 IndianHistory 类的资源。要获取 Indian History 下的所有图书列表,您将调用它的 find 方法,它类似于 Active Record find 方法。
1
>> books = IndianHistory.find (:all)




这个 Active Resource 模块类似于 Active Record 模块;它们拥有相同的风格。
假设您正在寻找标题为 “Akbar” 的图书,可以使用以下代码:
1
>> books = IndianHistory.find(:all, :params => { :title => “Akbar”}}




与 Active                Record find 方法中的常规 :conditions 子句不同,本示例使用了 :params,且 URL 是 GET http://indian-history.com/indian_histories.xml?title=Akbar
Active Resource 不仅限于检索数据。您可以使用所有 CRUD 操作。在脚本/控制台中,您可以使用:
1
>> IndianHistory.create (:title => “Jhansi Stories”, :amount => 233.00, :available => 0)




上述代码行将使用提供的数据向 create 动作中存在清单 2 中的代码的控制器创建一个 HTTP POST。
清单 2. Create
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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




如果图书记录成功保存,将返回新创建的、状态码为 HTTP 201 的记录,并将使用新创建的记录重定向视图。
同样,您也可以更新和删除记录,主要您拥有执行管理的权限和访问权。
对于 Update 操作,在脚本/控制台中使用:
清单 3. Update
1
2
3
4
5
>> book= IndianHistory.find (2)
>> book.available = 1
>> book.save
>> book = IndianHistory.find (2)
>> book.available # => 1




您更新了图书的可用性并保存记录。ActiveResource 和 ActiveRecord 之间有一个细微差别:ActiveResource 中没有方法 save 和 update。
最后,下面的语句将从数据库移除记录。
1
>> IndianHistory.delete(2)




除了上面介绍的基本操作外,Active Resource 还允许通过设置一个 HTTP 头部来支持 HTTP 基本身份验证。假如用户名和密码被设置且在身份验证失败时抛出错误,则客户机和服务器连接的安全检查就能通过每个连接上的 Active Resource 身份验证来完成。基本的身份验证也可以轻松实现。
返回列表