技术已荒废

生活的理想,是为了理想的生活!

---->>Nothing is impossible for a willing heart.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
许多被人描述为“脚本语言”的语言令人感兴趣,具有极大的可能来构建Web服务客户端应用程序。术语“脚本语言”被广泛的用于一些语言,这些语言是从现有构件建立的"quick and dirty"解决方案,而不是一个完整的系统编程语言。这些语言通常具有很多新的语句,并且具有细节的自动管理功能,例如内存管理。

  基于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包.下面是取得一个股票引用的所有程序,加入行号以方便讨论。

 require 'soap/wsdlDriver'

   wsdl_url 
= "http://ws.invesbot.com/stockquotes.asmx?WSDL"

   soap 
= SOAP::WSDLDriverFactory.new( wsdl_url ).create_rpc_driver

   soap.wiredump_file_base 
= "soapresult"

   param 
= {"symbol" => "WAG" }

   result 
= soap.getQuote( param )

   puts result.getQuoteResult.stockQuote.prevClose
第1行从标准库载入"soap/wsdlDriver"代码。第2行代码创建一个包含访问描述股票引用服务的WSDL文件的Url变量。注意在Ruby中,被命名为“wsdl_url”的变量并不包含一个相关的类的类型,它可以引用任何的对象类型。

  第3行进行了许多幕后的工作,最后创建了一个定制化的类的实例,该定制化类是由WSDL描述的Web service。最后的对象被创建出来,并具有了一系列的方法,这些方法的名字都是从 WSDL包含的变量得到的,例如在第4行取得设置的"wiredump_file_base"。如果变量是一个集合,SOAP请求和响应的全文都将会在本地文件中记录下来,这在处理复杂的Web服务中是一个很大的帮助。

  第5行创建了一个“hash”——一个和具有股票标识的命名符号相关的数组——在例子中,"WAG"代码表示Walgreens。这个hash是把股票代码映射为SOAP 请求元素。下面的就是WSDL中描述GetQuote方法的那部分。

 <s:element name="GetQuote">
     
<s:complexType>
       
<s:sequence>
        
<s:element minOccurs="0" maxOccurs="1" name="symbol" type="s:string" />
       
</s:sequence>
     
</s:complexType>
  
</s:element>
第6行调用了getQuote方法,getQuote方法是在一个由Ruby从WSDL中动态创建的定制类中的。这个方法完成了所有的格式化SOAP请求,联系Web service和解析SOAP响应的工作。它所返回的“结果”是一个一般的“映射”对象,包含了SOAP响应的数据。断定确定的语法来从这个响应中得到有用的数据并不是那么重要的。熟悉SOAP响应所透露的全部信息将会揭示出这个服务返回了许多的数据,并且这些数据大都在WSDL中简单的以以下的形式描述的:
<s:element minOccurs="0" maxOccurs="1" name="GetQuoteResult">
    
<s:complexType mixed="true">
       
<s:sequence>
         
<s:any />
       
</s:sequence>
     
</s:complexType>
  
</s:element>

我们实际需要的内容是在GetQuoteResult元素中的StockQuote 元素所包含的PrevClose元素内的。第7行输出了这个内容,并把它标记为"getQuoteResult.stockQuote.prevClose",而不是使用元素的名字的以大写字母开始的形式,如 “StockQuote”。我并不确定为什么Ruby库要这样设计,但是发现这个敲门还真浪费了不少时间。

  正如你在例子中看到的,一个Ruby中的Web service客户端可以通过使用标准库以很少的几行代码来创建。和一个具有更长的历史和更多支持者的语言来对比,你可能需要做更多的试验,所以具有脚本语言的快速测试能力将会是一个很大的帮助。

posted on 2006-10-08 21:04  技术已荒废  阅读(929)  评论(0编辑  收藏  举报