Rails - 使用另一个应用程序的SOAP接口

kik*_*ito 7 soap ruby-on-rails

我有一个纯粹的,有效的Rails应用程序.

我现在需要它开始与另一个应用程序(sympa)进行通信.此应用程序公开了一个SOAP接口,因此我尝试使用它是有意义的(命令行界面不完整).

我应该遵循哪些步骤?

我应该使用什么宝石/插件?

有没有人有工作教程/例子?

我或多或少熟悉一般的SOAP概念,但我以前从未使用过SOAP.我理解REST.

kik*_*ito 11

编辑:这是rails 2.x的过时答案约会.对于更现有的答案,我建议你观看有轨电视#290.我在这里留下这个答案,以防有人因为某些原因仍在使用rails 2.x,并且无法应用Ryan Bates在那里所说的内容.

我已经和它斗争了好几天了,我想我自己找到了解决方案.

我能为SOAP交互找到的最简单,最活跃的gem叫做Savon.

它应该与Ruby本身一起使用.以下是关于如何在Rails中使用它的快速浏览:

安装宝石.最简单的方法是编辑配置/环境并添加

config.gem "savon"
Run Code Online (Sandbox Code Playgroud)

然后运行

rake gems:install
Run Code Online (Sandbox Code Playgroud)

这应该安装savon和几个宝石.

接下来,在您的app/models/目录上创建一个类(它不必是ActiveRecord的子类,只是您的models目录上的常规类)

如果你像我一样,你会希望尽可能远离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
Run Code Online (Sandbox Code Playgroud)

您将主要使用它来调用方法.您将能够调用的方法取决于"其他站点"提供的服务.让我们假设有3个动作可用 - :create_monkey,:destroy_monkey&:list_monkeys.您可以通过在rails控制台上执行此操作来确认列表是否正确:

MyWebservice.soap_actions
=> [:create_monkey, :destroy_monkey, :list_monkeys]
Run Code Online (Sandbox Code Playgroud)

现在想象一下你要调用: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>
Run Code Online (Sandbox Code Playgroud)

所以需要两个参数:namehair_color.在ruby控制台上,您可以像这样调用它:

MyWebService.invoke :create_monkey, {:name => 'frank', :hair_color => 'red' }
=> {:status => 'ok'}
Run Code Online (Sandbox Code Playgroud)

你会得到一个哈希作为回应.在这种情况下,我获得了'ok'状态,但它可能要复杂得多.

后来,你可以创建(例如)无表格模型Monkey,并定义类似的方法new,create等使用web服务.

我遗漏了许多有趣的东西,比如安全性.但如果你遇到同样的问题,这应该可以让你开始.

问候!