атрибуты мыла savon

Я пытаюсь запросить netsuite api для валют. Следующий запрос мыла у меня работает в клиенте пользовательского интерфейса SOAP. Но мне трудно добиться того же, работающего с Ruby Savon gem версии 0.9.7.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:messages_2012_2.platform.webservices.netsuite.com" xmlns:urn1="urn:core_2012_2.platform.webservices.netsuite.com">
   <soapenv:Header>
      <urn:passport>
         <urn1:email>[email protected]</urn1:email>
         <urn1:password>xxx</urn1:password>
         <urn1:account>xxx</urn1:account>
      </urn:passport>
   </soapenv:Header>
   <soapenv:Body>
      <urn:getAll>
         <urn:record recordType="currency"/>
      </urn:getAll>
   </soapenv:Body>
</soapenv:Envelope>

В основном я не могу установить атрибут в элементе urn: record. Следующее не работает:

response = client.request :urn, :get_all do
  soap.body = { "urn:record" => { :attributes! => { "recordType" => "currency" } } }
end

Пожалуйста, порекомендуйте.


person Pratik Khadloya    schedule 20.10.2012    source источник


Ответы (3)


Как объясняется на странице http://savonrb.com, ключ в хэше attributes! должен соответствовать тегу XML. Вы хотите написать что-то вроде этого:

response = client.request :urn, :get_all do
  soap.body = {'urn:record'=>'',
               :attributes!=>{'urn:record'=>{'recordType'=>'currency'}}
              }
end

Сообщите нам, решит ли это проблему за вас.

person Steffen Roller    schedule 20.10.2012
comment
Спасибо, Штеффен, похоже, мы продвинулись вперед. Но теперь он терпит неудачу, потому что я думаю, что он ожидает soapenv: в качестве префикса для тегов Header и Body, а не просто env :. Вы знаете, как заставить работать эту приставку? - person Pratik Khadloya; 22.10.2012
comment
Понятно, это soap.env_namespace = "soapenv" Но это не помогло, так как заголовок мыла не отправлялся. - person Pratik Khadloya; 22.10.2012
comment
Наконец-то поработал с настройкой soap.header = passport_header. Где password_header - это {'urn: паспорт' = ›{'urn: email' =› NETSUITE_EMAIL, 'urn: password' = ›NETSUITE_PWD, 'urn: account' =› NETSUITE_ACCT}}. - person Pratik Khadloya; 22.10.2012

Еще раз проверьте запрос сырого мыла. : get_all может нуждаться в "getAll", чтобы Savon воспринимал вас буквально; он может изменить его на GetAll

person user1760826    schedule 20.10.2012
comment
по умолчанию Савон конвертирует :get_all в getAll. См. Документацию на сайте savonrb.com - person Steffen Roller; 22.10.2012

В новой версии Savon вы можете разместить атрибуты: в локальном контексте для тега операции:

@interaction_client.call(:retrieve_interaction, message: message_hash, :attributes => {  'attachmentInfo' => include_attachments.to_s  }) 

В этом случае атрибут attachmentInfo будет помещен в основной тег операции, связанный с операцией, в этом примере это будет тег ns:RetrieveInteractionRequest.

Обратите внимание, что синтаксис не содержит восклицательного знака.

person Alexander.Iljushkin    schedule 21.07.2014