【IT168 技术文档】
在这个网络世界当中,客户端和服务器之间的信息交互是最常见的应用需求之一。你会选什么技术实现?直接通过Socket编写协议,实现业务需求?拜托,现在已经是21世纪了,还网络通信都只想到用socket啊:)。你可能想到远程方法/过程调用(比如Java RMI/.NET Remoting),它们确实不错,但是依赖于某个平台或厂商,不适合跨平台的应用。
庆幸的是,我们还有SOAP(Simple Object Access Protocol简单对象访问协议)。
这个技术是各大厂商在意识到不同平台间信息相互的重要性以后制订的,基于XML-RPC之上,用来实现跨平台的Web Service。不同编程语言都有相应的实现,当然,今天我们的主角是ruby!
在《Programming Ruby》里面就有实现SOAP的例子,今天就让我们来体验一下ruby实现Web Service的乐趣。
#首先咱们写一个类,它就包含一个返回一条信息的方法。
#等下就让客户端来调用这个方法。
class Hello
def say
"Hello, world!"
end
end
#这是服务器端代码
require 'soap/rpc/standaloneServer'
NS = '[url]http://localhost/hello[/url]' #这是Web Service的地址
class HelloServer < SOAP::RPC::StandaloneServer
def on_init
hello = Hello.new
add_method(hello, 'say')
end
end
#新建一个服务器,绑定12321端口。
svr = HelloServer.new('hello', NS, '0.0.0.0', 12321)
trap('INT') { svr.shutdown } # 实现Ctrl + C退出程序
svr.start
面是服务器的代码,将上面的代码保存成server.rb
ruby server.rb 服务器就启动了。
Ok,下面是客户端的代码。
其实你可以用自己喜欢的语言写客户端,但是这里我仍然采用了ruby:
require 'soap/rpc/driver'
proxy = SOAP::RPC::Driver.new("[url]http://localhost:12321[/url]",
"[url]http://localhost/hello[/url]")
proxy.add_method('say')
puts "Message from server: #{proxy.say}"
若将客户端代码保存成client.rb,执行以后结果为:
Message from server: Hello, world!
哈哈,很简单吧,上面的例子没有传递参数,下面这个例子包含了参数传递。
服务器实现了一个加法运算器的Web Service,只要传递2个数值性型参数,就会返回2个参数的和。
#服务器端
class AddClass
def add(i, j)
return i.to_i + j.to_i
end
end
require 'soap/rpc/standaloneServer'
NS = '[url]http://localhost/add[/url]'
class AddServer < SOAP::RPC::StandaloneServer
def on_init
add = AddClass.new
add_method(add, 'add')
end
end
svr = AddServer.new('hello', NS, '0.0.0.0', 12321) proxy = SOAP::RPC::Driver.new("[url]http://localhost:12321[/url]",
trap('INT') { svr.shutdown }
svr.start
#客户端
require 'soap/rpc/driver'
"[url]http://localhost/add[/url]")
proxy.add_method('add', 'i', 'j')
puts "1 + 1: #{proxy.add(1, 1)}"
反正代码很简单,我也不做进一步的解释了,有了这个例子。
可以说整个Web Service世界的窗口就已经打开了,你要实现什么任务?
Just do it, come on baby!
PS:我尝试了用其他语言来调用Ruby写的SOAP服务,发觉是可以的,使用的语言为REALbasic。