Как мне создать конверт SOAP в Ruby? - PullRequest
1 голос
/ 04 июня 2010

Я использую Savon для сборки клиента, но хочу знать, как создать настоящий конверт.

Я думаю об использовании Nokogiri XML Builder и просто передаю значения, но не уверен, что это правильный путь.

Спецификации конверта SOAP можно найти здесь:

http://api.postalmethods.com/PostalWS.asmx?op=UploadFile

Ответы [ 2 ]

3 голосов
/ 04 июня 2010

Мой ответ будет: не надо.

Савон автоматически создаст для вас конверт. Вы можете передать любой заголовок и тело, как хотите, в виде массивов и хэшей или строк XML. Вы можете манипулировать существующими (по умолчанию) пространствами имен и даже отменять действия ввода. Я не уверен, почему кому-то нужно создавать конверт SOAP в XML-парсере, таком как nokogiri.

Если ваша причина отказа от использования Savon для создания оболочки заключается в том, что ей не хватает какой-то функциональности, которая требуется конечной точке, дайте мне знать, в чем именно заключается проблема. В прошлом мне приходилось вносить довольно значительные изменения в Savon, чтобы удовлетворить определенные API, поэтому есть вероятность, что у меня уже есть патч для вас. И если нет, я, безусловно, могу указать вам правильное направление, чтобы вы могли создать свой собственный патч.

И если вам все еще нужно создать конверт за пределами Savon, я бы порекомендовал вам вообще не использовать Savon и просто отправлять XML через одну из многих замечательных http-библиотек.

EDIT:

Чтобы проиллюстрировать, как использовать заголовки SOAP (и пространства имен), вы можете включить их и тело в метод запроса:

client = Savon::Client.new "http://url.to/wsdl"

response = client.get do |soap|
  # Use merge! for namespaces so that you don't overwrite all of the original namespaces (while still retaining the ability to overwrite individual ones)
  soap.namespaces.merge!({
    "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
    "xmlns:xsd" => "http://www.w3.org/2001/XMLSchema"
  })

  # Use soap.header just like you would soap.body
  soap.header = {
    # SOAP header hash
  }

  # soap.body as usual
  soap.body = {
    # SOAP body hash
  }
end
1 голос
/ 04 июня 2010

Savon рассматривает входные данные для служб SOAP как вложенные хэши. Конверт создан Савоном, поэтому вам вообще не нужно беспокоиться об этом, если вообще.

Вам действительно удалось подключиться к услуге, и если нет, какие ошибки вы получаете?

Если вы еще не подключились и / или у вас возникли проблемы с понятием, как это сделать, вам следует приступить к следующим действиям.

require 'savon'

client = Savon::Client.new http://api.postalmethods.com/PostalWS.asmx?wsdl
response = client.UploadFile do |soap|
  soap.body = {
    "Username" => "My User",
    "Password" => "My password"
    ...
  }
end

Если вы заполните пробелы в ... это должно помочь вам начать, хотя разбор wsdl может не быть способом продвижения вперед в производстве. Посмотрите документацию Savon для конкретных проблем, которые вы получаете.

Редактировать

Если вы не уверены в Savon и SOAP, вы можете просто использовать гем postalmethods , как описано здесь , вместо того, чтобы заново изобретать колесо

...