Подтвердить что ты не робот

Просмотр XML-запроса Savon без отправки на сервер

Я использую камень 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
4b9b3361

Ответ 1

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

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

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

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

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

EDIT: там также savon_spec, который является небольшим помощником для базового тестирования на основе прибора с помощью Savon.

Ответ 2

Использование 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

Ответ 3

Вы можете напрямую с помощью метода 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 для полного документа.

Ответ 4

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

class Savon::SOAP::Request
  def response
    pp   self.request.headers
    puts
    puts self.request.body
    exit
  end
end

Ответ 5

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

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

Подробнее о глобальном значении здесь.

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

Ответ 6

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

Ответ 7

У меня была та же проблема и исправлена ​​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. Он не принимает аргумент блока так же, как и клиент .call, поэтому он не сможет воспроизвести каждый тип запроса, который вы делаете, но он отвечает моим потребностям.