ruby - Savon皂体问题

标签 ruby soap savon

我正在使用 savon 0.9.2 和 ruby​​ 1.8.7。 我正在尝试提出复杂类型的 SOAP 请求。

我需要弄清楚如何使用 ruby​​ 和 savon 为以下类型的请求编写 SOAP 体。基本上,请求中的一个复杂类型扩展了另一种类型,并且也需要编码为数组。

soap 请求对象应该如下所示。

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:app="http://someurl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<soapenv:Header/>
<soapenv:Body>
<app:someMethod soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<xyzResReq xsi:type="java:xyzResReq" xmlns:java="java:com.xyz.request">
<somestring xsi:type="xsd:string">abc123</somestring>
<itinerary xsi:type="java1:xyzItinerary" xmlns:java1="java:com.xyz.domain">
<someList xsi:type="java2:List" soapenc:arrayType="xsd:anyType[]" xmlns:java2="java:language_builtins.util"/>
</itinerary>
</xyzResReq>
</app:someMethod>
</soapenv:Body>
</soapenv:Envelope> 

someList 又是模式形式中的复杂类型

<xsd:complexType name="someList">
<xsd:complexContent>
<xsd:extension base="stns:someBaseList">
<xsd:sequence>
<xsd:element maxOccurs="1" name="someElement" type="xsd:boolean" minOccurs="0" />
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

和 someBaseList 定义为

<xsd:complexType name="someBaseList"> 
<xsd:sequence>
<xsd:element maxOccurs="1" nillable="true" name="baseElement" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>

我如何在 savon 中执行此操作。

最佳答案

Savon 基于这样的假设:大多数请求 (XML) 足够简单,可以抽象为哈希。在这个复杂的示例中,我建议两种选择:

  1. 您可以使用任何 Ruby 对象(不是哈希)来代替哈希,并响应 to_s。因此,您可以使用 to_s 方法创建一个对象(或对象的层次结构),该方法通过类似 Builder 构建 XML。并将其传递给 Savon::SOAP::XML#body=

    class SomeXML
      def self.to_s
        "<some>xml</some>"
      end
    end
    
    client.request :some_action do
      soap.body = SomeXML
    end
    
  2. 您还可以使用 Savon::SOAP::XML#xml,它为给定 block 生成一个 Builder 实例,以“动态”构造 XML。

    client.request :some_action do
      soap.xml do |xml|
        xml.person { |b| b.name("Jim"); b.phone("555-1234") }
      end
    end
    

希望有帮助!另外,请查看the new Savon Guide .

关于ruby - Savon皂体问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6267579/

相关文章:

ruby - 我如何使用 savon 嵌套属性!哈希?

ruby-on-rails - 从整数值获取枚举字符串名称的最佳方法是什么

ruby - Ruby中Fixnum object_ids上的模式?

java - FedEx 跟踪 API 错误 9040 - Java Web 服务

asp.net - 从 ASP.net 中运行的 Web 引用客户端获取 RAW Soap 数据

ruby - 从 Ruby 成功调用 WCF 服务?任何人?

ruby - 为什么未声明的 Ruby 局部变量、实例变量、类变量和全局变量具有不同的行为?

mysql - 如何在数据库中保存数组 - Rails

python - 哪些 python SOAP 库仍在维护?

ruby - Savon :Module 的未定义方法 `configure'