2011-06-07 46 views
2

我使用savon 0.9.2和ruby 1.8.7。 我想做一個複雜的類型肥皂請求。Savon皁體問題

我需要弄清楚如何使用ruby和savon爲以下類型的請求編寫soap body。基本上,請求中的一種複雜類型擴展了另一種類型,並且還需要編碼爲一個數組。

肥皂請求對象應該看起來像這樣。

<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> 

如何在薩翁做到這一點。

回答

4

Savon基於這樣的假設:大多數請求(XML)足夠簡單,可以抽象爲散列。在這個複雜的例子,我建議兩個備選方案:

  1. 取而代之的是哈希的,你可以使用任何Ruby對象(這不是一個哈希)和響應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,這將產生一個生成器實例給定塊的構建「對飛」的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