快速业务通道

跨越边界: REST on Rails - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
行为良好的应用程序提供正 确处理文档的充足信息。其中一条信息叫做 HTTP Accept 头。只要多花一点力气,控制器就能利用一些 助手,用 Accept 头决定如何响应进入的请求。然后,控制器可以呈现适当的响应。请把 PeopleController 中的 list 方法改成像清单 5 一样:

清单 5. 扩展 list方法以呈现 XML

def list # wants is determined by the http Accept header in the request @people = Person.find_all respond_to do |wants|   wants.html   wants.xml { render :xml => @people.to_xml } end end

在清单 5 中,可以看到完整的基于 REST 的 Web 服务。生成的代码是 Rails 中小型的特定于域的语 句的优美示例,它扩展 Ruby 以构造一种 switch 语句。它的工作方式是这样的:

respond_to 方法接受单个代码块,并传递一个实例变量(标为 wants)到代码块。

wants 对每个可能的类型都有一个方法。控制器可以为控制器期望的每个类型指定一个代码块。

如果方法名称与 HTTP Accept 头中的类型匹配,wants 方法执行对应的代码块。

如果没有指定代码块(例如 wants.html),Rails 就执行默认动作(在这个示例中,呈现 app/views/people/list.rhtml)。

这个策略允许在所有预期的客户之间共享相同的设置代码。如果需要添加期望 HTML 的 JavaScript 客户,以便让应用程序支持 Ajax,只需要添加 wants.js,如清单 6 所示:

清单 6. 为 JavaScript 客户呈现 HTML

def list   # wants is determined by the http Accept header in the request   @people = Person.find_all   respond_to do |wants|     wants.html     wants.js     wants.xml { render :xml => @people.to_xml }   end end

现在已经看到了如何向只读的方法中添加 REST Web 服务。show 方法也类似,如清单 7 所示:

清单 7. 实现 show

def show   @person = Person.find(params[:id])   respond_to do |wants|     wants.html     wants.xml { render :xml => @person.to_xml }   end end

跨越边界: REST on Rails(5)

时间:2011-07-25 IBM Bruce Tate

您可能已经注意到,通过 REST 看到的只有只读服务。原因是:让应用程序处理提交和删除所需要的 工作比较少。删除不需要额外的支持,因为当前的代码已经用 URL 指定了要删除的人的 ID。Rails 自动 转换 post 请求中进入的 XML,所以不需要构建任何服务器端支持。实际上,应用程序不用变就能删除、 更新和创建。可以修补每个方法呈现的 HTTP 响应,但是客户代码实际就在 HTTP 返回码之后。

现在是调用 Web 服务的时候了。

调用 Web 服务

使用现有 HTTP 协议这一策略使得调用变得简单。清单 8 显示了 Ruby 版本。请注意 HTTP Accept 头。记住,控制器根据这个头决定内容的类型。

清单 8. 从 Ruby 调用服务

require ''net/http'' Net::HTTP.start(''localhost'', 3000) do |http|   response = http.get(''/people/list'', ''Accept'' => ''text/xml'')   #Do something with the response.   puts "Code: #{response.code}"   puts "Message: #{response.message}"   puts "Body:\n #{response.body}" end

清单 8 中的 Web 服务调用,在 http://localhost:3000/people/list 上调用 HTTP get 方法,并输 出响应。Ruby 有很好的库可以处理生成的 XML,但是它们超出了本文的范围。不需要用 Ruby 调用这个 服务。只需要 HTTP 的库。清单 9 显示这个服务的 Java 调用:

清单 9. 用 Java 代码调用服务

package com.rapidred.ws; import java.net.*; import java.io.*; public class SimpleGet {    void get() {      try {     

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号