Savon消息请求

时间:2014-03-27 15:29:58

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

所以我传递给Savon client.call的XML请求字符串如下(请注意这是有效的,我得到了回复):

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" 
xmlns:mun="http://schemas.datacontract.org/2004/07/External.Service.Bo">
   <soap:Header/>
   <soap:Body>
      <tem:GetInformationsForCoordinates>
         <tem:coordReq>
            <mun:Coordinates>
               <mun:Coordinate>
                  <mun:Id>1</mun:Id>
                  <mun:QualityIndex>90</mun:QualityIndex>
                  <mun:X>-110.5322</mun:X>
                  <mun:Y>35.2108</mun:Y>
               </mun:Coordinate>
            </mun:Coordinates>
         </tem:coordReq>
         <tem:analysisTypes>
            <mun:AnalysisType>Additional</mun:AnalysisType>
         </tem:analysisTypes>
      </tem:GetInformationsForCoordinates>
   </soap:Body>
</soap:Envelope>

而不是将其传递给xml并不是真的可行,我想传递一条消息,以便我可以轻松添加多个(可能是一组坐标),多种分析类型等。

目前我必须做的Ruby代码是:

  coordinate = { Id: '1', QualityIndex: 90, X: -110.5322, Y: 35.2108}
  coordinates = {Coordinates: [coordinate] }
  coordinateReq = {coordReq: {coordinates: coordinates} }

然后我将coordinateReq传递给client.call - 我可以在Ruby控制台中看到下面生成的请求:

<env:Envelope xmlns:env="http://www.w3.org/2003/05/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>
            <QualityIndex>90</QualityIndex>
            <X>-110.5322</X>
            <Y>35.2108</Y>
          </Coordinates>
        </coordinates>
      </coordReq>
    </tns:GetInformationsForCoordinates>
  </env:Body>
</env:Envelope>

有一些问题 - 有没有办法可以将namespance mun添加到类似于我的字符串关闭XML的正确属性(即Id / QualityIndex等)。同样在我的示例中,Ruby代码坐标是小写,然后坐标是大写,而它应该是大写但不是复数。最后,我需要包括analyzeTypes(注意小写一个大写的T),然后分析AnalysisType,其中可能有多个请求,AnalysisType也需要mun命名空间。

2 个答案:

答案 0 :(得分:1)

使用Steffen答案按预期工作 - 只有注意事项是我在评论中提到的我必须添加命名空间,如下所示(以防万一其他人遇到这个问题:

  namespaces = {
    "xmlns:mun" => "http://schemas.datacontract.org/2004/07/External.Service.Bo"
  }

然后在Savon.client中进行以下操作(请注意命名空间行是关键字:

 client = Savon.client(wsdl: WSDL_URL,
                        log: true, # set to true to switch on logging
                        namespaces: namespaces,
                        #etc more config set up

答案 1 :(得分:0)

而不是像

这样的符号
QualityIndex: 90

你需要指定一个像

这样的字符串
'mun:QualityIndex' => 90