试图用Savon构建SOAP请求?

时间:2014-03-24 10:34:57

标签: ruby-on-rails ruby soap savon

我正在尝试从Ruby on Rails获取SOAP服务 - 从SOAP UI我可以很好地处理它,请求XML如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:mun="http://schemas.datacontract.org/2004/07/MyExternalService.Map" xmlns:mun1="http://schemas.datacontract.org/2004/07/MyExternalService.Common.Map">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetInformationsForCoordinates>
         <!--Optional:-->
         <tem:coordReq>
            <!--Optional:-->
            <mun:Coordinates>
               <!--Zero or more repetitions:-->
               <mun:Coordinate>
                  <!--Optional:-->
                  <mun:Id>1</mun:Id>
                  <!--Optional:-->
                  <mun:QualityIndex>90</mun:QualityIndex>
                  <!--Optional:-->
                  <mun:X>-110.5322</mun:X>
                  <!--Optional:-->
                  <mun:Y>35.2108</mun:Y>
               </mun:Coordinate>
            </mun:Coordinates>
         </tem:coordReq>
         <!--Optional:-->
         <tem:analysisTypes>
            <!--Zero or more repetitions:-->
            <mun:AnalysisType>Additional</mun:AnalysisType>
         </tem:analysisTypes>
      </tem:GetInformationsForCoordinates>
   </soapenv:Body>
</soapenv:Envelope>

如果我将精确的XML复制到带有request = %q(XML STRING)的Ruby字符串中并使用该方法,然后在Savon中调用以下内容:

response = client.call(:get_info, xml: request)

它按预期工作,我得到了我的回复 - 但实际上我想将参数传递给Savon。到目前为止,我尝试了以下内容:

  coordinate = { Id: '1', X: -110.5322, Y: 35.2108, QualityIndex: 90 }
  coordinates = {Coordinates: [coordinate] }
  coordinateReq = {coordReq: {coordinates: coordinates} }
  response = client.call(:get_informations_for_coordinates, message: coordinateReq)

这失败了,如果我查看我发送的XML,请在下面填写:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <env:Body>
    <tns:GetInformationsForCoordinates>
      <coordReq>
        <coordinates>
          <coordinates>
            <Id>1</Id>
            <X>-110.5322</X>
            <Y>35.2108</Y>
            <QualityIndex>90</QualityIndex>
          </coordinates>
        </coordinates>
      </coordReq>
    </tns:GetInformationsForCoordinates>
  </env:Body>
</env:Envelope>

与从SOAP UI发送的内容相比,我缺少xmlns:mum命名空间 - 无论如何我可以添加它我的请求,以便将它添加到每个参数,即X,Y QualityIndex - 也是类似的tem在我的Savon调用中的tns被添加到SOAPUI中的coordReq但不在我的Savon调用中 - 无论如何我可以添加它吗?

另外,我在解决如何构建请求的analysisTypes和AnalysisType部分时遇到了一些困难?

2 个答案:

答案 0 :(得分:0)

来自documentation

  

<强>命名空间

     

如果你没有将命名空间传递给Savon::Client#request,Savon会   为您注册目标命名空间(“xmlns:wsdl”)。如果你这样做了   传递命名空间,Savon将使用它而不是默认命名空间。对于   例如:

client.request :v1, :get_user

<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:v1="http://v1.example.com">
  <env:Body>
    <v1:GetUser>
  </env:Body>
</env:Envelope>
     

您始终可以设置命名空间或覆盖Savon设置的命名空间。   命名空间存储为一个简单的哈希。

# setting a new namespace
soap.namespaces["xmlns:g2"] = "http://g2.example.com"

# overwriting the "xmlns:wsdl" namespace
soap.namespaces["xmlns:wsdl"] = "http://ns.example.com"

显然,对于Savon 2,设置多个名称空间为impossible

  

我发现(目前)无法设置多个名称空间   萨文的第2版。

     

现在我在Savon版本1上迁移我的应用程序并且它工作了=)

答案 1 :(得分:0)

要使用多个名称空间,请在客户端定义中添加以下类型的代码

...
:namespaces => {
    "xmlns:v2" => "http://v2.example.com",
    "xmlns:v1" => "http://v1.example.com" },
...
相关问题