跨越边界: REST on Rails

过去的 20 年间,一个趋势主导了商业软件工具的开发:用复杂性对抗复杂性。这一趋势在任何地方 都没有比在分布式计算领域更明显。C 和 Java 社区已经看到一些惊人复杂的框架被构建出来支 持分布式通信。分布式计算环境(DCE)支持用 C 语言编写的应用程序之间的远程过程调用。公共对象请 求代理架构(CORBA)标准支持面向对象应用程序之间的通信。企业 JavaBean(EJB)规范提供安全性、 持久性、事务、消息和远程的服务。对各个框架的宣传甚嚣尘上,但是这些框架都没有满足预期,有些甚 至因为它们的复杂性而成为灾难。在这些框架中,只有 EJB 3.0 属于大力简化的结果,有潜力在分布式 应用程序上成功。市场可能给、也可能不给这个面临强敌的框架另一个空间,但 EJB 仍然需要交付使用 。

最新的大型分布式框架是 Web 服务。Web 服务技术让应用程序可以用平台独立或编程语言独立 的方式相互通信(请参阅 参考资料)。Web 服务标准也受到复杂性恶魔的威胁,但是称作 REST 的替代 策略承诺了更简单的方式。本文介绍了如何在 Ruby on Rails 中添加 REST 风格的 Web 服务,并从 Ruby 和 Java 代码调用服务。

Web 服务领域

就像 EJB、CORBA 和 DCE 一样,Web 服务的 核心抽象也是远程过程调用。Web 服务利用叫做 SOAP(最初,SOAP 代表简单对象存取协议,但是这个术 语现在降级了)的协议,用 XML 表示消息的结构。这里有一个技巧:如果协议用代表简单的 S 开始,那 它就不简单。Web 服务定义语言(WSDL)提供了服务的标准规范。像 SOAP 一样,WSDL 也是一个棘手而 复杂的 API,而 SOAP 和 WSDL 仅仅涉及到了构成 Web 服务这个大怪物的众多 API 的表面(请参阅 参 考资料)。Web 服务需要一次大修,感谢 Roy Fielding 的一份有影响的博士论文,Web 服务得到了大修 (请参阅 参考资料)。

Fielding 的论文描述了 REST 应用程序联网策略。REST 与全堆栈 Web 服务根本不同,主要原因有三 个:

REST 的核心抽象是远程资源而不是远程过程调用。

REST 没有发明一个详尽的标准列表,而是采用现有的 Internet 标准,包括 HTTP、XML 和 TCP/IP。

REST 没有覆盖每个可能场景,而是覆盖了最常见的问题。

请把 REST 想像成浏览。REST 客户使用与浏览器相同的 HTTP 命令访问资源。当 REST 客户访问到资 源的表示时,客户转换到一个状态。使用不同的 HTTP 命令,REST 客户可以创建、读取、更新或删除资 源的记录。

例如,以典型的博客为例。通过输入 URL,例如 blog.rapidred.com,得到贴子的列表。然后,如果 想编辑博客条目,可以在 URL 中输入 HTTP 参数(例如 blog.rapidred.com/edit?article=12345),然 后显示编辑表单。由于每个博客条目都有自己的 URL,所以点击链接或直接输入 URL,就可以用 HTTP 命 令读取、修改或删除内容。

简而言之,REST 可以:

用 TCP/IP 命名标准命名 Web 上的资源

用 HTTP 查询和操纵这些资源

使用基于文本的标准消息格式(例如 XML 或 HTML)来构造数据

Ruby on Rails 用 REST 对 Web 服务提供了优秀的支持。

Action Web Services 概述

Rails 用叫做 Action Web Services 的模块实现 Web 服务。许多开发框架鼓励视图和 Web 服务使用 独立的控制器。这个策略可以维护控制器之间的风格一致。问题是针对所服务的每种内容,都需要一个新 控制器。例如,Ajax 用户界面要求从控制器取得到 JavaScript 的远程 XML 调用。

不必为 Web 服务专门分配一个控制器,使用 Rails,可以通用地用同一个控制器向基于 HTML 的视图 、基于 XML 的 Web 服务和基于 XML 的 JavaScript 组件提供内容。理解 Action Web Services 的最好 方式就是在工作应用程序的环境下查看它的实际作用。

请用自己选择的数据库管理器创建一个叫做 service_development 的数据库。接下来,用以下命令创 建 Rails 项目和模型:

> rails service
> script/generate model Person

在生成模型之后,就有了一个叫做 db/migrate/001_create_people.rb 的迁移。请把这个迁移编辑成 像清单 1 一样:

清单 1. people 表的迁移

class CreatePeople < ActiveRecord::Migration
  def self.up
   create_table :people do |t|
    t.column :first_name, :string, :limit => 40
    t.column :last_name, :string, :limit => 40
    t.column :email, :string, :limit => 40
    t.column :phone, :string, :limit => 15
   end
  end
  def self.down
   drop_table :people
  end
end

时间: 2024-11-03 22:10:30

跨越边界: REST on Rails的相关文章

跨越边界: Ruby on Rails的秘笈是什么?

Ruby on Rails(也叫做 Rails)是一个针对支持数据库的 Internet 应用程序的 Ruby 框架.我现在 已经将 Rails 用于两个不同的应用程序并涉及了另外两个关联的程序.为了即将完成的新书 Java to Ruby(参见 参考资料),我已经采访了很多 Rails 开发人员(那些在该框架上既成功也失败过的人). 框架的创始人和 Rails 书籍的旗舰之作 Agile Web Development with Rails(参见 Resources)的主要 作者.我开始理解为

跨越边界: 活动记录和Java编程中特定于域的语言

DSL 是专门解决特定于域问题的语言.通过更接近问题的操作,DSL 可以提供在通用语言中可能找不 到的好处.Java 世界中充满了 DSL.属性文件.Spring 上下文.标注的某种用法以及 Ant 任务,都是 DSL 的示例. 在开始研究其他像 Ruby 这样的语言的时候,我开始理解到 Java 语言目前对于 DSL 还没有良好的把 握.在这篇文章中,将看到 Ruby 使用的四种集成干净的 DSL 的技巧.然后,将看到在 Java 语言中可 能存在的选项是什么. 隐藏语言的世界 虽然您可能不知

跨越边界: Streamlined,第1部分

我生平首次参加马拉松培训.马拉松培训最有趣的方面--实际上,也是惟一的方面--就是提高不 断叠加所带来的影响.有时,我为了提高效率而进行专门为了改进身体条件而设计的长短跑.有时,在跑 步过程中,我学习避免小的错误,避免重复多余的姿势(多余的姿势对单个步幅没有太大影响,但却会在 整个 26.2 英里的跑步过程中浪费能量或伤害到我).我每周都有提高,可每周之间的区别并不显著.但 是一个训练计划周期过后,我会从最初只能跑 4 英里提高到能跑 26.2 英里.软件开发也与此类似.如 果持续进行小的改进,

跨越边界: 闭包

10 年前,我刚刚开始山地自行车运动的时候,我更愿意选用零件尽可能少尽可能简单的自行车.稍后 ,我意识到一些零件(如后减震器)可以保护我的背部和我自行车的框架在德克萨斯州高低起伏的山区中 免受损害.我于是可以骑得更快,出问题的次数也渐少.虽然随之带来了操作上的复杂性和维护需求的增 加,但对于我来说这点代价还是值得的. 关于闭包这个问题,Java 爱好者们现在陷入了类似的争论中.一些人认为闭包带给编程语言的额外复 杂性并不划算.他们的论点是:为了闭包带来的一点点便利而打破原有语法糖的简洁性非常不值

跨越边界: Lisp之美

Lisp 长久以来一直被视为伟大的编程语言之一.其漫长的发展过程(接近五十年)中引发的追随狂潮 表明:这是一门非同凡响的语言.在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位.像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力.但令其追随者懊恼万分 的是,Lisp 从未成为主流编程语言.作为一名 Java 程序员,如果您花一点时间研究 Lisp 这座 被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术. 我最近第一次完成了马拉松赛跑

跨越边界:浅谈Java模型以外的类型策略

当谈到 Java 语言的类型方法时,Java 社区分为两大阵营.一些人喜欢编译时错误检查,更好的安全 性,以及改善的工具 -- 这些都是静态类型所能提供的特性.而另一些人则偏爱更动态的类型体验.这 一次在 跨越边界 中,您将看到两种高生产力的非 Java 语言所使用的一些截然不同的类型策略,并发现 在 Java 编程中提高类型灵活性的一些方法. 在对任何编程语言的讨论中,争议较大的一个问题就是类型模型.类型决定可以使用哪些种类的工具 ,并影响到应用程序的设计.很多开发人员将类型与生产率或可维护性

跨越边界: JavaScript语言特性

JavaScript 常被人们认为是编程语言中无足轻重的一员.这种观点的形成可以"归功"于 其开发工具.复杂且不一致的面向 HTML 页面的文档对象模型以及不一致的浏览器实现.但 JavaScript 绝对不仅仅是一个玩具这么简单.在本文中,Bruce Tate 向您介绍了 JavaScript 的语言特性. 几乎每个 Web 开发人员都曾有过诅咒 JavaScript 的经历.这个备受争议的语言受累于其复杂的称为 文档对象模型 (DOM)的编程模型.糟糕的实现和调试工具以及不一致的浏

《MacTalk 跨越边界》一一3.3 千万别惹程序员

3.3 千万别惹程序员 MacTalk 跨越边界 作为一个程序员,看电影的一大乐趣就是观摩电影中出现的那些技术场面.当年看不死小强的24小时,非常痴迷CTU的操作系统,电脑之间的交互操作像Solaris,整体UI看起来又像是定制的Linux,上网Google了半天而不得其解,后来国外一个朋友告诉我,很多国外电影里的操作系统画面为了达到炫酷的效果,都是用Flash做出来的动画,所以你看不到他们敲错程序,也没有人按退格键. 得知了这个消息之后,我怅然若失了很久,一直以来,我以为军方和FBI的操作系统

《MacTalk 跨越边界》一一3.1 程序员真正的价值

3.1 程序员真正的价值 MacTalk 跨越边界 问:池老师,我是个不爱互动的人,但是您所有的文章我都看了,非常感谢您的引导,我入手了人生第一台MBP.现在问题来了,但是找不到更合适的人解答,只能求助于您了,如果您有时间的话.问题是这样的:我有个32bit UNIX file(开启一个服务进程),在Mac上执行时的错误提示是:exec format error,但是在Linux服务器上却可以执行,为何?Mac上有可以运行的方案吗?期待您的回复,不胜感激. 答:Linux和OS X是不同的操作系