【问题标题】:Savon soap body problemSavon肥皂身体问题
【发布时间】:2011-06-07 15:24:51
【问题描述】:

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

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

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 中做到这一点。

【问题讨论】:

    标签: ruby soap savon


    【解决方案1】:

    Savon 假设大多数请求 (XML) 都足够简单,可以抽象为 Hash。在这个复杂的例子中,我建议有两种选择:

    1. 您可以使用任何 Ruby 对象(不是 Hash)来代替 Hash,并响应 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,它为给定块生成一个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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      相关资源
      最近更新 更多