【问题标题】:Passing Array Elements for Savon 2 (SOAP)为 Savon 2 (SOAP) 传递数组元素
【发布时间】:2014-01-07 21:46:26
【问题描述】:

我正在尝试使用从 SOAP api 获取帐户信息的 Savon gem (v2) 在 Ruby 中编写代码,但我在传递数组时遇到问题。

CampaignIds 应该是一个整数数组。

这是我的代码:

client = Savon.client(wsdl: "https://api7secure.publicaster.com/Pub7APIV1/Campaign.svc?singleWsdl")

message = {
  "EncryptedAccountID" => api_key,
  "APIPassword" => api_password,
  "CampaignIds" => [3,4],
  "StartDate" => yesterday,
  "EndDate" => yesterday,
  "IncludeTests" => false
}

client.call(:get_comparative_report_details_data, message: message)

产生以下请求:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:tns="http://BlueSkyFactory.Publicaster7.Public.API" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <env:Body>
      <tns:GetComparativeReportDetailsData>
         <tns:EncryptedAccountID>*****</tns:EncryptedAccountID>
         <tns:APIPassword>*****</tns:APIPassword>
         <tns:CampaignIds>3</tns:CampaignIds>
         <tns:CampaignIds>4</tns:CampaignIds>
         <tns:StartDate>2014-01-06</tns:StartDate>
         <tns:EndDate>2014-01-06</tns:EndDate>
         <tns:IncludeTests>false</tns:IncludeTests>
      </tns:GetComparativeReportDetailsData>
   </env:Body>
</env:Envelope>

然而,如果我在 SOUP UI 中玩耍,请求应该如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:blu="http://BlueSkyFactory.Publicaster7.Public.API" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
   <soapenv:Header/>
   <soapenv:Body>
      <blu:GetComparativeReportData>
         <blu:EncryptedAccountID>*****</blu:EncryptedAccountID>
         <blu:APIPassword>*****</blu:APIPassword>
         <blu:CampaignIds>
            <arr:int>3</arr:int>
            <arr:int>4</arr:int>
         </blu:CampaignIds>
         <blu:StartDate>2014-01-06T16:21:47-05:00</blu:StartDate>
         <blu:EndDate>2014-01-07T16:21:47-05:00</blu:EndDate>
         <blu:IncludeTests>false</blu:IncludeTests>
      </blu:GetComparativeReportData>
   </soapenv:Body>
</soapenv:Envelope>

有什么想法吗?

【问题讨论】:

    标签: ruby api soap soapui savon


    【解决方案1】:

    你可以试试这个语法:

    message = {
      ...
      "CampaignIds" => {"int" => [3,4]},
      ...
    }
    

    这将产生这个输出:

    <CampaignIds>
      <int>3</int>
      <int>4</int>
    </CampaignIds>
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢,我通过"CampaignIds" =&gt; { "ins0:int" = &gt; 3 }找到了答案
    • 我厌倦了 ins0: int,我尝试了 int,两者都得到:soapFault: No open start element,当尝试写入结束元素时。然后我尝试在肥皂 UI 中添加 type="int" 和 xsi:type="xsd:int" 作为我需要成为 int 的元素中的属性。使用我得到的属性:422 Unprocessable Entity:服务器遇到错误。所有这些我都尝试了文字和编码。请指教
    【解决方案2】:

    我刚刚遇到了同样的问题并找到了一个解决方案,该解决方案不依赖于具有许可的 SOAP 端点。您可以使用 unwrap 键将此行为配置为全局行为。此密钥作为Gyoku 的一个选项提供,它为Savon 生成XML。

    client = Savon.client(wsdl: 'https://example.com/wsdl', unwrap: true)
    client.call(:cook_meal, message: { 'Ingredients' => ['tomato', 'basil', 'mozzarella'] })
    

    虽然问题老了,但迟到总比没有好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多