Savon 2.5.1的Soap客户端请求代码

时间:2014-06-06 13:33:07

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

我正在使用Savon gem(版本2.5.1)来创建Soap请求,并且需要格式化如下:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:soap1="urn:website.co.uk/soap:callreport7">
   <soap:Header>
      <soap1:callcreditheaders>
         <soap1:company>?</soap1:company>
         <soap1:username>?</soap1:username>
         <soap1:password>?</soap1:password>
      </soap1:callcreditheaders>
   </soap:Header>
   <soap:Body>
      <soap1:Test07a>?</soap1:Test07a>
   </soap:Body>
</soap:Envelope>

到目前为止,我已经提出以下建议:

client = Savon.client(
  wsdl: "CallReport7.wsdl",
  env_namespace: :soap,
  soap_header: { 
    "soap1:callcreditheaders" => {
      'soap1:company' => 'XXXX',
      'soap1:username' => 'XXXX',
      'soap1:password' => 'XXXX'
    }
  }
)
response = client.call(:test07a, message: "Test" )

在控制台中运行时返回错误:

Savon::SOAPFault: (soap:Server) An internal system error has occurred

如果我删除了soap_header哈希,那么测试运行并返回:

<?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <Test07aResponse xmlns="website.co.uk/soap:callreport7">
        <TestResult>
          <datetime>2014-06-06T14:18:35.081125+01:00</datetime>
        </TestResult>
      </Test07aResponse>
    </soap:Body>
  </soap:Envelope>

问题是我需要头信息,我无法弄清楚如何格式化请求。

2 个答案:

答案 0 :(得分:0)

像往常一样:首先使用SoapUI创建一个有效的请求。然后在Savon中构建等价物(不必完全相同)。

答案 1 :(得分:0)

事实证明问题在于信封。我启用了我的代码中的日志记录,因此我可以看到Savon生成的SOAP,然后允许我在SoapUI中尝试请求并进行一些试验和错误测试。原来问题出在Envelope上,所以下面修复了我的问题:

client = Savon.client(
  wsdl: "CallReport7.wsdl",
  pretty_print_xml: true,
  log: true,
  env_namespace: :soap,
  namespaces: {"xmlns:soap" => "http://www.w3.org/2003/05/soap-envelope", "xmlns:soap1" => "urn:website.co.uk/soap:callreport7"},
  soap_header: { 
    "soap1:callcreditheaders" => {
      'soap1:company' => 'XXXX',
      'soap1:username' => 'XXXX',
      'soap1:password' => 'XXXX'
    }
  }
)
response = client.call(:test07a, message: "Test" )

代码记录行是解决这个问题的关键。