Savon 使用内置请求生成器而不是原始 xml

Savon using built in request builder instead of raw xml

如果我将 savon 与原始 xml 一起使用,一切正常,这是原始 xml 示例:

request = client.call(:authenticate, xml:'<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="xxxx/">
  <SOAP-ENV:Body>
    <ns1:authenticate>
      <ns1:username>user</ns1:username>
      <ns1:password>pwd</ns1:password>
      <ns1:cultureInfo>it</ns1:cultureInfo>
    </ns1:authenticate>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>')

如果我使用内置方法调用方法时出错,代码如下:

credentials={ username: 'user', password: 'pwd!!', cultureInfo: "it" }
response     = client.call(:authenticate, message: credentials)

这是上面代码产生的xml:

<?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://tempuri.org/"
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
  <env:Body>
    <wsdl:authenticate>
      <username>user</username>
      <password>pwd</password>
      <cultureInfo>it</cultureInfo>
    </wsdl:authenticate>
  </env:Body>
</env:Envelope>

有什么想法吗?

我经常这样做(未经测试)。它不漂亮,但它有效。

credentials = { 'ns1:username' => 'user',
                'ns1:password' => 'pwd!!',
                'ns1:cultureInfo' => "it" }
response = client.call(:authenticate, message: credentials)

您可能希望使 ns1 的使用适应您实际使用的命名空间。