Ruby Savon устанавливает элемент заголовка SOAP

Я пытаюсь добавить элемент ключа API в заголовок SOAP с помощью Savon, но проигрываю битву. Я новичок в Ruby, и то немногое, что я знаю, это самоучка. Согласно их документам API, это то, что мне нужно добавить: эта функция ProductServe будет возвращать (SOAP-заголовок) элемент аутентификации, и это должно быть отправлено с каждым отдельным запросом.

Параметры

Required  Name     Type    Description                              Min Occurs Max Occurs
No        sToken   string  Unique token to identify visitor.        0          1
Yes       sApiKey  string  User specific key to authenticate user.  1          1

http://wiki.affiliatewindow.com/index.php/UserAuthentication

Мне не удалось найти ничего похожего на то, что я хочу сделать, и это код, который я пробовал:

endpoint = "http://v3.core.com.productserve.com/ProductServeService.wsdl"
client = Savon.client

response = client.request :urn, "getCategory" do
  soap.endpoint = endpoint
  soap.header = {
    "urn:sApiKey" => "xxxx"
  }
end

Любая помощь будет принята с благодарностью!


person skeniver    schedule 04.12.2012    source источник
comment
пожалуйста, создайте пример запроса (для этого вы можете использовать soapUI) или предоставьте wsdl как суть или пасту.   -  person rubiii    schedule 05.12.2012
comment
я слепой :) этот пункт принадлежит @LazyMonkey   -  person rubiii    schedule 05.12.2012
comment
Я получаю сообщение об ошибке: Savon::Client#request требует хотя бы один аргумент, но имеет код: response = client.request :urn, getProductList do soap.endpoint = endpoint soap.header = { sApiKey =› test } end Я знаю, что это не связано с исходной проблемой, но я бы постарался не задавать новый вопрос, поскольку вы уже ответили здесь :)   -  person skeniver    schedule 05.12.2012
comment
странный. как вы можете видеть, взглянув на предложение защиты в savon/client.rb, он только проверяет, передали ли вы какие-либо аргументы методу #request. я бы использовал жемчужину отладчика, чтобы следовать коду до предложения защиты, чтобы увидеть, что происходит.   -  person rubiii    schedule 05.12.2012
comment
Используя отладчик, я обнаружил, что запрос вызывается как минимум дважды. В первый раз заполняются аргументы: (rdb:10) args [:urn, getProductList] Во второй раз нет...: (rdb:10) args [] (rdb:10) args.empty? true Есть идеи, что может пойти не так?   -  person skeniver    schedule 06.12.2012
comment
Проблемы оказались из-за того, что я дважды вызывал client.request. Так что, как я и должен был подозревать, это моя собственная глупая ошибка :D   -  person skeniver    schedule 06.12.2012


Ответы (1)


Похоже, вам нужно настроить клиент Savon:

client = Savon::Client.new do
  wsdl.document = endpoint
  wsdl.element_form_default = :unqualified
end

Я внес эти изменения, и остальная часть вашего кода вернула действительный ответ SOAP.

Бессовестно взят из этот вопрос

person LazyMonkey    schedule 04.12.2012
comment
Миллион благодарностей господа! - person skeniver; 05.12.2012