2010-09-20 6 views
7

Sto tentando di utilizzare Savon per fare alcune richieste SOAP, ma temo di dover andare oltre le basi in qualche modo.Come utilizzare gli oggetti con xsi: tipi in Savon

Ho bisogno di inviare qualcosa sulla falsariga di:

<env:Body> 
    <wsdl:methodName> 
    <parameter xsi:type='ValueClass'>value</parameter> 
    </wsdl:methodName> 
</env:Body> 

Ora, se io non ho dovuto specificare che xsi: type, sarebbe una semplice questione di:

client.method_name { |soap| soap.body = {:parameter => 'value'} } 

Il problema è il xsi: digitare il parametro; a causa del modo in cui il servizio Web che sto usando è costruito attorno al polimorfismo, ho bisogno di specificare esplicitamente di che tipo è il parametro. C'è un modo in cui posso farlo (preferibilmente senza dover generare il mio XML?) Mi piacerebbe davvero far cadere soap4r per sempre :)

Grazie!

risposta

7

Specificando XML attributi in un hash è abbastanza brutto, ma è possibile:

client.method_name do |soap| 
    soap.body = { 
    :parameter => 'value', 
    :attributes! => { :parameter => { 'xsi:type' => ValueClass } } 
    } 
end 

Si prega di dare un'occhiata a: http://github.com/rubiii/savon/wiki/SOAP

Fino Savon supporta XML Schema Attributi, vorrei suggerire di utilizzare Builder
(che viene fornito con Savon) per generare il XML:

client.method_name do |soap| 
    xml = Builder::XmlMarkup.new 
    soap.body = xml.parameter "value", "xsi:type" => "ValueClass" 
end 
+1

ho questo: { 'xsi: type' => V alueClass '}} un refuso? l'ultimo 'dopo ValueClass? – Ba7a7chy

+1

sì, quello è un errore di battitura! andando a correggere la risposta. – rubiii

+0

Come posso fare lo stesso in Savon 2.x? Dal momento che non c'è più sapone, corpo. – Miletos