Search code examples
ruby-on-railsrubyapisoapsavon

How build proper SOAP request to https://wyszukiwarkaregontest.stat.gov.pl with Savon gem


I'm trying to use the savon 2.7.2 gem to make a SOAP request, like this:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action>
      <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To>
   </soap:Header>
   <soap:Body>
      <ns:Zaloguj>
         <!--Optional:-->
         <ns:pKluczUzytkownika>abcde12345abcde12345</ns:pKluczUzytkownika>
      </ns:Zaloguj>
   </soap:Body>
</soap:Envelope>

I tried different aproaches to achieve this, for example:

client = Savon.client(wsdl: "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", namespace: "http://CIS/BIR/PUBL/2014/07")
client.call(:zaloguj, message: { "pKluczUzytkownika" => "abcde12345abcde12345" })

But it gives me Savon::HTTPError: HTTP error (415): The server cannot service the request because the media type is unsupported

When I inspect savon's builder.build_document it returns:

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:wsdl=\"http://CIS/BIR/PUBL/2014/07\" xmlns:env=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <env:Body>
    <wsdl:Zaloguj>
      <pKluczUzytkownika>abcde12345abcde12345</pKluczUzytkownika>
    </wsdl:Zaloguj>
  </env:Body>
</env:Envelope>"

I made request to wsdl from RailsCasts without problems, but with this... I spent a couple of hours to figure it out and nothing. Can anyone help me? :)


Solution

  • ok, this is solution to my problem:

    client = Savon.client(wsdl: "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/wsdl/UslugaBIRzewnPubl.xsd", namespace: "http://CIS/BIR/PUBL/2014/07", env_namespace: :soap, use_wsa_headers: true, soap_version: 2, endpoint: "https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc", namespace_identifier: :ns)
    response = client.call(:zaloguj, message: { "ns:pKluczUzytkownika" => "abcde12345abcde12345" }, soap_action: "http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj")
    

    I hope, you find it useful :)