how to build soap_header in savon

249 views
Skip to first unread message

Juanfra Magrini

unread,
Sep 6, 2016, 12:44:13 PM9/6/16
to Savon
Hi!

I'm using savon 2.0 and I'm dealing with a problem to communicate savon with the following WSDL:

Can someone tell me how is the syntax to use the savon client and make the call?
How to build the soap_header?

Here is my code:

header = {
        :message_header => {
          :@id => '?',
          :@version => '?',
          :from => {
            :party_id => '?',
          },
          :to => {
            :party_id => '?',
          },
          :conversation_id => '?',
          :action => 'session_create_rq',
          :domain => 'DEFAULT',

          :security => {
              :username_token => {
                username: 'xxxxx',
                password: 'xxxx',
                organization: 'xxx',
                domain: 'xxxx',
            }
          }
        }
      }
  soap_header: header)
client.call(:session_create_rq, message: {})



Also, here is the xml wich I used to test the api with Boomerang Client.

    <env:Header>
        <mes:MessageHeader id="?" version="?">
            <mes:From>
                <mes:PartyId type="?"/>
                <mes:Role>?</mes:Role>
            </mes:From>
            <mes:To>
                <mes:PartyId type="?"/>
                <mes:Role>?</mes:Role>
            </mes:To>
            <mes:CPAId>?</mes:CPAId>
            <mes:ConversationId>?</mes:ConversationId>
            <mes:Service type="?"/>
            <mes:Action>SessionCreateRQ</mes:Action>
            <mes:MessageData>
                <mes:MessageId>?</mes:MessageId>
                <mes:Timestamp/>
                <mes:RefToMessageId>?</mes:RefToMessageId>
                <mes:TimeToLive/>
                <mes:Timeout>30000</mes:Timeout>
            </mes:MessageData>
            <mes:DuplicateElimination/>
            <mes:Description/>
        </mes:MessageHeader>
        <sec:Security>
            <sec:UsernameToken>
                <sec:Username>xxxx</sec:Username>
                <sec:Password>xxxx</sec:Password>
                <sec:NewPassword>?</sec:NewPassword>
                <sec:Organization>xxxxx</sec:Organization>
                <sec:Domain>xxxxx</sec:Domain>
            </sec:UsernameToken>
            <sec:SabreAth></sec:SabreAth>
            <sec:BinarySecurityToken></sec:BinarySecurityToken>
        </sec:Security>
    </env:Header>
    <env:Body>
        <ns:SessionCreateRQ returnContextID="?">
            <ns:POS>
                <ns:Source PseudoCityCode="?"/>
            </ns:POS>
        </ns:SessionCreateRQ>
    </env:Body>
</env:Envelope>


This is the error I got:

Savon::SOAPFault: (soap-env:Client.InvalidAction) Action specified in EbxmlMessage does not exist.




Hope you can help me.

Thanks!

Regards,

Juanfra. 

Juanfra Magrini

unread,
Sep 13, 2016, 10:11:49 AM9/13/16
to Savon
Finally, I found a solution. Here is what I did

      header = {
        'mes:MessageHeader': {
          :@id => '?',
          :@version => '?',
          'mes:From': {
            'mes:PartyId': {
              :@type => '?'
            }
          },
          'mes:To': {
            'mes:PartyId': {
              :@type => '?'
            }
          },
          'mes:ConversationId': '?',
          'mes:Action': 'SessionCreateRQ',
        },
        'sec:Security': {
            'sec:UsernameToken': {
              'sec:Username': 'xxxx',
              'sec:Password': 'xxxx',
              'sec:Organization': 'xxx',
              'sec:Domain': 'xxxxx',
          }
        }
      }
      namespaces = {
        "xmlns:ns" => "http://www.opentravel.org/OTA/2002/11",
        "xmlns:mes" => "http://www.ebxml.org/namespaces/messageHeader",
        "xmlns:sec" => "http://schemas.xmlsoap.org/ws/2002/12/secext",
        soap_header: header,
        namespaces: namespaces)
        response = client.call(:session_create_rq)
Reply all
Reply to author
Forward
0 new messages