编辑:这是一个过时的答案,约会 Rails 2.x。如需更现成的答案,建议您观看轨道广播 #290 http://railscasts.com/episodes/290-soap-with-savon。我将这个答案留在这里,以防有人由于某种原因仍在使用 Rails 2.x,并且无法应用 Ryan Bates 所说的内容。
我已经为此奋斗了几天,我想我自己找到了解决方案。
我能找到的用于 SOAP 交互的最简单、最活跃的 gem 称为Savon http://github.com/rubiii/savon.
它应该可以与 Ruby 本身一起使用。以下是关于如何将它与 Rails 一起使用的快速浏览:
安装宝石。最简单的方法是编辑配置/环境并添加
config.gem "savon"
然后运行
rake gems:install
这应该会安装 savon 以及更多的 gem。
接下来,在您的上创建一个类app/models/
目录(它不必是 ActiveRecord 的子类,只需是模型目录中的常规类)
如果您像我一样,您会希望尽可能远离 XML。您可以通过创建一个像这样的类来做到这一点:
class MyWebservice
WSDL = "http://www.theWebSiteWithAService.com/wsdl"
def self.client
@@client ||= Savon::Client.new(WSDL)
end
def self.soap_actions
return client.wsdl.soap_actions
end
def self.invoke(action, parameters)
response = client.send(action) { |soap| soap.body = parameters }
return response.to_hash
end
end
您将主要使用它来调用方法。您能够调用的方法类型取决于“其他站点”提供的服务。让我们假设有 3 个可用的操作 -:create_monkey
, :destroy_monkey
& :list_monkeys
。您可以通过在 Rails 控制台上执行以下操作来确认该列表是否正确:
MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
现在假设您要调用 :create_monkey。首先,您需要知道该调用需要哪些参数。查看此内容的最佳位置是 wsdl 文件本身。你应该看到这样的东西:
<message name="create_monkey_request">
<part name="name" type="xsd:string"/>
<part name="hair_color" type="xsd:string"/>
</message>
<message name="create_monkey_response">
<part name="status" type="xsd:string"/>
</message>
所以它需要两个参数:name
and hair_color
。在 ruby 控制台上,您可以像这样调用它:
MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
您将得到一个哈希值作为响应。在这种情况下,我得到了“正常”状态,但情况可能要复杂得多。
稍后,您可以创建(例如)无桌模型 http://railscasts.com/episodes/193-tableless-model called Monkey
,并定义方法,例如new
, create
等使用网络服务的。
我遗漏了很多有趣的事情,比如安全性。但如果您遇到与我相同的问题,这应该可以帮助您入门。
Regards!