基于TIOBE语言流行性的调查,现在最为流行的 “脚本”语言是PHP,Perl,Python, JavaScript 和 Ruby。Perl是早期的Internet的重负荷载体,但其流行性正在减退。PHP作为一个创建网页的工具还在不断的变得更加流行,但是我决定要看一看Ruby。整个工业界轰动于用Ruby开发的基于面向数据库的开源项目“Rails” Web架构,我对此留有深刻的印象。
Ruby编程语言大概是在1995形成的,它差不多和Java是在同一个时代。尽管如此,由于其创建是基于单独的创建者Yukihiro Matsumoto的预想,而不是一个联合的开发团队的合作的结果,所以它的发展始终是更加缓慢的,并且也没有取得那么广泛的使用。在过去的几年中,一个关于在开源项目的兴趣的调查发现,整个社区已推动了许多的Ruby开发。现在Ruby的版本是1.8.4,即将到来的最新版本是1.9。
Ruby是一个具有动态类型的解释型面向对象语言。Ruby的一个典型的运行环境包括一个快速测试的交互接口。现在的标准库包括处理XML文档的扩展类和访问用XML-RPC和SOAP 类型的Web services的具体类。
一个XML-RPC的Ruby例子
下面是所有的访问一个XML-RPC 类型的Web服务的Ruby代码,加入行号以便于讨论。
1. require 'xmlrpc/client'
2. server = XMLRPC::Client.new2("http://time.xmlrpc.com/RPC2")
3. result = server.call("currentTime.getCurrentTime")
4. printf("xmlrpc time %i:%i:%i ", result.hour, result.min, result.sec)
第1行使“xmlrpc/client”代码从标准库中装载出来。第2行创建了一个使用一个Url和默认标准的客户端类的实例。在第3行,你也许能够从以前的文章中回忆起来,XML-RPC协议使用一个简单的数据类型集合,并且不要求命名空间。其中的一个数据类型是timestamp,它在Ruby XML-RPC中成为一个DateTime类的实列,而DateTime类将会由第3行的服务调用返回。第4行使用大家熟悉的"printf"语法来显示DateTime对象的独立成员的值。
一个Ruby的SOAP例子
许多版本的Ruby构建的SOAP工具已经由动态开源Ruby社区开发出来了。在我的XML-RPC的成功的鼓励下,我决定试一试可以直接依靠WSDL工作的标准库工具。然而它却比我预想的要难,因为它的文档和示例并没有和开发相关的,例如,Sun的Web Services Developer的Java包.下面是取得一个股票引用的所有程序,加入行号以方便讨论。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
第3行进行了许多幕后的工作,最后创建了一个定制化的类的实例,该定制化类是由WSDL描述的Web service。最后的对象被创建出来,并具有了一系列的方法,这些方法的名字都是从 WSDL包含的变量得到的,例如在第4行取得设置的"wiredump_file_base"。如果变量是一个集合,SOAP请求和响应的全文都将会在本地文件中记录下来,这在处理复杂的Web服务中是一个很大的帮助。
第5行创建了一个“hash”——一个和具有股票标识的命名符号相关的数组——在例子中,"WAG"代码表示Walgreens。这个hash是把股票代码映射为SOAP 请求元素。下面的就是WSDL中描述GetQuote方法的那部分。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
我们实际需要的内容是在GetQuoteResult元素中的StockQuote 元素所包含的PrevClose元素内的。第7行输出了这个内容,并把它标记为"getQuoteResult.stockQuote.prevClose",而不是使用元素的名字的以大写字母开始的形式,如 “StockQuote”。我并不确定为什么Ruby库要这样设计,但是发现这个敲门还真浪费了不少时间。
正如你在例子中看到的,一个Ruby中的Web service客户端可以通过使用标准库以很少的几行代码来创建。和一个具有更长的历史和更多支持者的语言来对比,你可能需要做更多的试验,所以具有脚本语言的快速测试能力将会是一个很大的帮助。