2014-03-24 94 views
1

我想打从Ruby的SOAP服务on Rails的 - 从SOAP UI,我可以打它精致和请求XML是如下:试图用Savon构建SOAP请求?

<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到一个Ruby字符串request = %q(XML STRING)为萨翁和使用方法,然后在萨翁调用如下

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

它按预期工作,我得到我的回应 - 但在现实中我想只是传递参数给萨翁。到目前为止,我已经试过如下:

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 - 也是类似于我的Savon调用中的tns的tem添加到SOAPUI中的coordReq,但不添加在我的萨翁召集 - 无论如何,我可以添加它?

此外,我在编制如何构建我的请求的分析类型和AnalysisType部分时遇到了一些困难?

回答

0

documentation

命名空间

如果没有命名空间传递给Savon::Client#request,萨翁将 注册你的目标命名空间(“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> 

您可以随时设置命名空间或覆盖由萨翁设置的命名空间。 命名空间存储为一个简单的哈希。

# 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" 

显然,对于萨翁2,设置多个命名空间是impossible

我发现这是不可能的(现在)就 萨翁第2版设置了多个命名空间。

现在我迁移我对萨翁第1版应用程序,它的工作=)

+0

对不起,我应该有说我正在使用萨翁版本2 - 我已经添加了这里显示的名称空间 - http://savonrb.com/version2/globals。html,但它添加了多个命名空间,我似乎无法工作,我需要某些参数的tem和其他的mun,因为它显示在我的SOAP UI请求中 –

+0

我的问题的其他部分的任何想法 - 即 - 如何建立分析响应和类型到我的请求我传递给消息: –

+0

编辑我的答案。我相信你应该为第二部分提出一个新问题。 –

0

要使用你把以下类型的代码多个命名空间中的客户机定义

... 
:namespaces => { 
    "xmlns:v2" => "http://v2.example.com", 
    "xmlns:v1" => "http://v1.example.com" }, 
... 
+0

这是否适用于Savon版本2 Steffen - 我如何确定哪个命名空间在不同的参数上被选取? –

+0

实际上只是发现了以下链接 - https://coderwall.com/p/erwfda - 因此会尝试,因为它建议 –

+0

是的,它应该工作vor v2。只需显式限定您的密钥,如'v1:Getuser','v2:whatever' –