Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7575993 建立时间:2006年5月29日 |

| |
[Ruby on Rails]Web services, Rails-style 软件技术
lhwork 发表于 2007/2/8 10:36:28 |
新的 REST web 服务在 Rails 1.1 内支持,它可以轻易地给你的应用程序添加 web 服务,你应该尽早使用它。
考虑一下:如果你的应用程序有个页面,它显示名单,没有 web 服务支持时它看起来像下面这样:
def list
@people = Person.find(:all)
end
下面是使用 web 服务支持的同样动作:
def list
@people = Person.find(:all)
respond_to do |wants|
wants.html
wants.xml { render :xml => @people.to_xml }
end
end
这段话要说明什么,“如果客户端希望以 HTML 来应答这个动作,就像我们已前的应答,但如果客户端相要 XML,在 XML 格式内返回名单。” (Rails 根据客户端递交的 HTTP Accept header 来确定期望的应答格式。)
现在,我们假设你有个动作,它添加一个新的,原先不存在的人员,随意创建它们的公司(按名字)。没有 web 服务支持,它看起来像下面这样:
def add
@company = Company.find_or_create_by_name(params[:company][:name])
@person = @company.people.create(params[:person])
redirect_to(person_list_url)
end
下面是有 web 服务支持的同样动作:
def add
company = params[:person].delete(:company)
@company = Company.find_or_create_by_name(company[:name])
@person = @company.people.create(params[:person])
respond_to do |wants|
wants.html { redirect_to(person_list_url) }
wants.js
wants.xml { render :xml => @person.to_xml(:include => @company) }
end
end
我们很简单地添加了对 RJS 的足够支付。如果客户端想要 HTML,我们只重定向它们以返回名单。如果它们想要 Javascript(wants.js),那么它是一个 RJS 请求,所以我们渲染与这个动作关联的 RJS 模板。最后,如果客户端想要 XML,我们渲染名单为 XML,但需要动一点脑筋:我们也在被渲染的 XML内包括 person 的公司,所以你会得下面这些:
<person>
<id>...</id>
...
<company>
<id>...</id>
<name>...</name>
...
</company>
</person>
注意,要在那个动作的顶部添上:
company = params[:person].delete(:company)
@company = Company.find_or_create_by_name(company[:name])
这是因为引入的 XML 文档(如果一个 web 服务请求是在进程内)只可以包含一个唯一的根结点。因此,我们必须重要整理以便请求看起来像这样 (url 编码):
person[name]=...&person[company][name]=...&...
并且,像这样 (xml 编码):
<person>
<name>...</name>
<company>
<name>...</name>
</company>
</person>
换句话说,我们生成请求,以便它在一个单独的实体----一个 person 上操作。然后,在动作内,我们从 request 内抽取公司数据,查找或创建公司,然后用余下数据创建新的 person 。
注意,你可以定义你自己的 XML 参数解析器,它将允许你在单个 request 内描述多个实体(例如,把它们包装在单个根结点内),但是如果你只使用流程并接受 Rails 的默认,那么生活会更轻松些。
http://weblog.jamisbuck.org/2006/3/27/web-services-rails-style |
|
|