SOAP em Ruby com Savon 2 e atributos aninhados

Então você quer consumir SOAP em Ruby? Bem, Savon é para você!

O triste é: no momento em que você vai além de solicitações SOAP muito simples, você obterá silêncio de rádio a partir da documentação lá.

Mesmo pesquisando por aí, descobrimos muitas coisas que funcionam para o Savon versão 1, mas são ligeiramente diferentes na versão 2.

Esta postagem é para a versão 2, mesmo que a versão 3 esteja chegando.
Suponha que um WSDL em um servidor de endpoint executando TLSv1 e um certificado autoassinado.
Ele também usa vários namespaces e atributos XML em subelementos na solicitação.

Aqui está um exemplo de solicitação:

<soapenv:Envelope >="http://schemas.xmlsoap.org/soap/envelope/" >="http://www.w3.org/2001/XMLSchema-instance" >="http://magiccompany.com/supermagic">
<soapenv:Header/>
<soapenv:Body>
<mag:example>
<someStuff>123</someStuff>
<someAuthStuff >="http://magiccompany.com/specialstuff"
xsi:type="n2:SpecialLogin">
<username>abc</username>
<password>test123</password>
</someAuthStuff>
</mag:example>
</soapenv:Body>
</soapenv:Envelope>

Agora precisamos de alguns ajustes nos padrões de Savon.

Atributos de configuração

Agora, na v2 do Savon, você pode definir atributos no elemento raiz da solicitação (em nosso caso mag:example, adicionando uma attributeschave ao hash da solicitação como este:

client.call (: someMethod, message: {example: {}}, attribute: {someAttr: 123})
Portanto, esta base é facilmente coberta.

Atributos aninhados

A parte importante neste XML: o namespace adicional e o no elemento aninhado. Então, como colocamos os dois atributos lá em Savon 2?xsi:type

Bem, aí vem o passeio de pônei mágico supernão óbvio : você pode especificá-los colocando uma chave com um hash para os elementos para os quais deseja definir atributos. Diversão!:attributes!

require 'savon'
client
= Savon.client(wsdl: 'wsdl/magic.wsdl', ssl_verify_mode: :none, ssl_version: :TLSv1)

client
.call(:example, message: {
someStuff
: 123,
someAuthStuff
: {
username
: "abc",
password
: "test123"
},
:attributes! => {
someAuthStuff
: {
"xsi:type" => "n2:SpecialLogin",
"> => "http://magiccompany.com/specialstuff"
}
}
})

Sim, sim – uso inconsistente da antiga e da nova sintaxe hash, mas para aquela chave, não quero mudar para a antiga sintaxe em nenhum outro lugar. É por isso.

Portanto, agora divirta-se, viva muito e prospere.