Просмотр XML-кода Savon без отправки на сервер - PullRequest
28 голосов
/ 02 мая 2011

Я использую гем Savon, чтобы сделать SOAP-запрос, используя код, подобный приведенному ниже. Это работает, но я хотел бы просмотреть / перехватить XML-запрос без фактического вызова их сервера. Теперь я могу просмотреть его после выполнения запроса, вставив строку отладчика после запроса и проверив переменную клиента.

Кто-нибудь знает способ просмотра XML-запроса без фактического выполнения запроса? Я хочу иметь возможность проверить XML по схеме, используя Cucumber или Rspec.

client = Savon::Client.new do |wsdl, http|
  wsdl.document = "http://fakesite.org/fake.asmx?wsdl"
end

client.request(:testpostdata, :xmlns => "http://fakesite.org/") do
  soap.header = { :cAuthentication => {"UserName" => "MyName", "Password" => "MyPassword" } }
  soap.body = { :xml_data => to_xml }
end

Ответы [ 7 ]

44 голосов
/ 02 августа 2014

Используя Savon 2, я делаю это таким образом, пишу метод, который возвращает тело запроса от клиента.

 client = Savon::Client.new(....)

это не упомянуто в документации

  def get_request
     # list of operations can be found using client.operations
     ops = client.operation(:action_name_here)

     # build the body of the xml inside the message here        
     ops.build(message: { id: 42, name: "Test User", age: 20 }).to_s
  end
29 голосов
/ 13 ноября 2015

Вы можете напрямую через метод Savon::Client#build_request.

Пример:

request = client.build_request(:some_operation, some_payload)
request.body # Get the request body
request.headers # Get the request headers

Возьмите пик @ https://github.com/savonrb/savon/blob/master/lib/savon/request.rb для полного документа.

12 голосов
/ 01 июня 2015

Я использую Savon 2.11, и я могу сделать это с глобальными переменными в клиенте:

def client
  @client ||= Savon.client(soap_version: 2,
                           wsdl:         config.wsdl,
                           logger:       Rails.logger,
                           log:          true)
end

Больше информации о глобалах здесь.

Затем регистратор выплевывает хост, глагол http и полный xml («заголовки» и тело) как для запроса, так и для ответа.

11 голосов
/ 19 мая 2011

Хотя я уверен, что есть лучший способ сделать это, я просто отверг ответ.

class Savon::SOAP::Request
  def response
    pp   self.request.headers
    puts
    puts self.request.body
    exit
  end
end
9 голосов
/ 17 мая 2013

Они обновили API с момента последнего поста. Установите этот параметр в Savon.client:: pretty_print_xml => true. После вашего звонка найдите в журналах запрос SOAP :. Выходные данные помещаются в стандартный вывод. Проверьте историю консоли консоли, если вы тестируете свое соединение с консоли.

7 голосов
/ 03 мая 2011

Savon использует HTTPI для выполнения запросов SOAP.HTTPI - это общий интерфейс поверх различных клиентов Ruby HTTP.Вероятно, вы могли бы смоделировать / заглушить HTTP-запрос, выполненный Savon через:

HTTPI.expects(:post).with do |http|
  SchemaValidation.validate(:get_user, http.body)
end

Обратите внимание, что я использовал Mocha для насмешки SOAP-запроса, получения тела HTTP и проверки его по некоторымметод проверки (псевдокод).

В настоящее время Savon не поддерживает создание запросов без их выполнения.Поэтому единственный способ проверить запрос - это перехватить его.

Если вам потребуется Savon для поддержки этой функции, пожалуйста, дайте мне знать и откройте заявку на GitHub .

РЕДАКТИРОВАТЬ: Есть также savon_spec , который является небольшим помощником для базового тестирования на основе приборов с Savon.

6 голосов
/ 19 октября 2013

У меня была та же проблема и я исправил Savon следующим образом:

module Savon
  class Client
    def get_request_xml operation_name, locals
      Savon::Builder.new(operation_name, @wsdl, @globals, locals).pretty
    end
  end
end

Это создает XML и возвращает его в виде строки без отправки в конечную точку API. Он не принимает аргумент блока так же, как и client.call, поэтому он не сможет воспроизвести каждый тип запроса, который вы делаете, но на данный момент он отвечает моим потребностям.

...