使用Savon和nokogiri制作Soap Request

时间:2014-02-11 16:31:56

标签: ruby-on-rails ruby soap nokogiri savon

我尝试制作的示例请求如下所示:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <GetList xmlns="http://tempuri.org/">
      <listRequest i:type="b:NpsListRequest" xmlns:a="http://schemas.datacontract.org/2004/07/Services.List" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Services.List.Strategies">
        <a:id>1</a:id>         
      </listRequest>
    </GetList>
  </s:Body>
</s:Envelope>

我可以使用Nokogiri完全复制,就像这样:

    builder = Nokogiri::XML::Builder.new do |xml|
      xml['s'].Envelope('xmlns:s' => "http://schemas.xmlsoap.org/soap/envelope/") {
        xml['s'].Body {
          xml.GetList('xmlns' => "http://tempuri.org/") {
            xml.listRequest('i:type' => "b:NpsListRequest", 'xmlns:a' => "http://schemas.datacontract.org/2004/07/Services.List", 'xmlns:i' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:b' => "http://schemas.datacontract.org/2004/07/Services.List.Strategies") {
              xml['a'].id(1)
            }
          }
        }
      }
    end

    builder.to_xml

然后,我使用Savon构建我的soap_client:

def soap_client
      soap_client = Savon.client(
        wsdl: "http://1.1.1.1/Api.svc?wsdl", #PLE
        headers: {"Authorization" =>  "Basic"},
        basic_auth: ['user', 'password'],
        env_namespace: :soapenv,
        namespace_identifier: :ser,
        ssl_verify_mode: :none,
        log: true,
        :pretty_print_xml => true
    )
  end

现在,我需要进行一次:get_list调用,看起来像上面的示例请求。

soap_client.operations会返回此信息:

[:get_list]所以我知道我已经过身份验证,客户端工作正常。

我无法弄清楚如何实际进行:get_list通话。

我想要一些简单的东西,我甚至不必使用Nokogiri来构建我自己的xml,如下所示:

soap_client.call :get_list, message: {id => 1}

但这似乎不是一个可行的解决方案。关于我如何将使用Nokogiri构建的XML传递给我:get_list的{​​{1}}调用的任何想法?我也对其他建议持开放态度。

0 个答案:

没有答案