2011-06-07 2 views
2

J'utilise savon 0.9.2 et rubis 1.8.7. J'essaie de faire une demande de savon de type complexe.Savon problème de corps de savon

Je dois trouver comment coder le corps de savon pour le type de demande ci-dessous en utilisant du rubis et du savon. Fondamentalement, l'un des types complexes de la requête étend un autre type et doit également être codé en tant que tableau. L'objet de demande de savon est supposé ressembler à ceci:

<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 est à nouveau un complexType sous forme de schéma

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

et someBaseList défini comme

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

Comment puis-je faire cela en savon.

Répondre

4

Savon est basé sur l'hypothèse que la plupart des requêtes (XML) sont assez simples pour être abstraites comme un Hash. Dans cet exemple complexe, je vous suggère deux alternatives:

  1. Au lieu d'une table de hachage, vous pouvez utiliser un objet Ruby (ce n'est pas un Hash) et répond à to_s. Vous pouvez donc créer un objet (ou une hiérarchie d'objets) avec une méthode to_s en construisant le XML via quelque chose comme Builder et le passer à 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. Vous pouvez également utiliser Savon::SOAP::XML#xml, ce qui donne une instance constructeur à un bloc donné pour construire le XML « à la volée ».

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

Hope that helps! En outre, s'il vous plaît jeter un oeil à the new Savon Guide.