我使用的是savon 0.9.2和ruby 1.8.7。
我正在尝试发出复杂类型的soap请求。
我需要弄清楚如何使用ruby和savon为下面类型的请求编写soap主体。基本上,请求中的一个complexTypes扩展了另一个类型,还需要编码为数组。
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还是模式表单中的complexType
<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>

一些基本列表定义为
<xsd:complexType name="someBaseList">
<xsd:sequence>
<xsd:element maxOccurs="1" nillable="true" name="baseElement" type="xsd:string" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>

在萨文我该怎么做。

最佳答案

savon基于这样的假设:大多数请求(xml)都足够简单,可以抽象为散列。在这个复杂的例子中,我建议两种选择:
您可以使用任何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

您还可以使用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

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

10-09 08:37