如何通过Rails 5在soap调用中添加Savon属性

时间:2017-08-23 14:06:37

标签: ruby-on-rails soap savon

我的SOAP调用应该在<soap:Envelope>中使用以下属性打开。

<soapenv:Envelope 
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
  xmlns:bar="http://postnl.nl/cif/services/BarcodeWebService/" 
  xmlns:tpp="http://postnl.nl/cif/domain/BarcodeWebService/">

如何将它们放在Savon那里?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,我将用于所有的肥皂呼叫。我发现我可以简单地在ruby %Q{}块和#{} ruby​​插值中添加xml。

我的电话现在看起来像这样:

@run = Run.find_by(invoice_id: @invoice.id)
      unless @run
        @run = @invoice.runs.build( delivery: @delivery )
        # (6.) Een PostNL SOAP-call wordt gemaakt.
        @client_barcode = Savon.client(
          :wsdl                    => 'https://testservice.postnl.com/CIF_SB/BarcodeWebService/1_1/?wsdl',
          :log                     => true,
          :pretty_print_xml        => true
        )

        @response_barcode = @client_barcode.call( :generate_barcode, xml: %Q{
          <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:bar="http://postnl.nl/cif/services/BarcodeWebService/" xmlns:tpp="http://postnl.nl/cif/domain/BarcodeWebService/">
            <soapenv:Header>
              <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                <wsse:UsernameToken>
                  <wsse:Username>devc_!R4xc8p9</wsse:Username>
                  <wsse:Password>#{ENV['postnl_password']}</wsse:Password>
                </wsse:UsernameToken>
              </wsse:Security>
            </soapenv:Header>
            <soapenv:Body>
              <bar:GenerateBarcode>
                <tpp:Message>
                  <tpp:MessageID>1</tpp:MessageID>
                  <tpp:MessageTimeStamp>02-05-2014 12:00:00</tpp:MessageTimeStamp>
                </tpp:Message>
                <tpp:Customer>
                  <tpp:CustomerCode>DEVC</tpp:CustomerCode>
                  <tpp:CustomerNumber>11223344</tpp:CustomerNumber>
                </tpp:Customer>
                <tpp:Barcode>
                  <tpp:Type>3S</tpp:Type>
                  <tpp:Range>DEVC</tpp:Range>
                  <tpp:Serie>000000000-999999999</tpp:Serie>
                </tpp:Barcode>
              </bar:GenerateBarcode>
            </soapenv:Body>
          </soapenv:Envelope>} ).to_hash

        @run.barcode = @response_barcode[:generate_barcode_response][:barcode]
        @run.save