2014-01-07 4 views
11

Я пытаюсь написать код в Ruby с драгоценным камнем Savon (v2), который извлекает информацию об учетной записи из SOAP api, но у меня проблема с передачей массива.Передача элементов массива для Savon 2 (SOAP)

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> 

тогда, если я поиграйте в СУП 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> 

Любые идеи?

ответ

18

Вы можете попробовать этот синтаксис:

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

Это будет производить этот вывод:

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

Надеется, что это помогает.

+2

Спасибо, я был в состоянии понять это, делая ' "CampaignIds"=> { "ins0: Int"=> 3}' –

+0

Я устал ins0: INT, я пытался ИНТ с обоими я получаю: SoapFault : Нет элемента открытого запуска при попытке записать конечный элемент. Затем я попытался использовать мыльный пользовательский интерфейс, просто добавляя type = "int" и xsi: type = "xsd: int" в качестве атрибута в элементе, который должен быть int. С атрибутами, которые я получил: 422 Непроцессная организация: сервер обнаружил ошибку. Все это я пробовал с буквальным и закодированным. пожалуйста, порекомендуйте – KacieHouser