log example ruby xml soap savon httpi

ruby - example - Ver Savon Request XML sin enviar al servidor



savon timeout (7)

Estoy usando la gema Savon para hacer una solicitud SOAP usando un código similar a lo que está debajo. Está funcionando, pero me gustaría ver / capturar el XML de la solicitud sin hacer una llamada a su servidor. Puedo verlo ahora después de realizar una solicitud, insertando una línea de depuración después de la solicitud e inspeccionando la variable del cliente.

¿Alguien sabe de una forma de ver el XML de solicitud sin realmente hacer una solicitud? Quiero poder validar el XML contra un esquema usando Cucumber o 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


Aunque estoy seguro de que hay una mejor manera de hacerlo, simplemente anulo la respuesta.

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


Estoy usando Savon 2.11 y puedo lograrlo con globales en el cliente:

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

Más información sobre los globales aquí.

Luego, el registrador escupe el host, el verbo http y el xml completo ("encabezados" y cuerpo) tanto para la solicitud como para la respuesta.


Han actualizado la API desde la última publicación. Establezca esta configuración en Savon.client:: pretty_print_xml => true. Después de su llamada, busque en los registros la solicitud SOAP :. La salida se pone a stdout. Verifique el historial de la consola de la consola si está probando su conexión desde la consola.


Puede directamente a través del método Savon::Client#build_request .

Ejemplo:

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

Tome un pico @ https://github.com/savonrb/savon/blob/master/lib/savon/request.rb para obtener el documento completo.


Tuve el mismo problema y parcheé a Savon de la siguiente manera:

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

Esto crea el XML y lo devuelve como una cadena sin enviarlo al punto final de la API. No acepta un argumento de bloque de la misma forma que client.call, por lo que no podrá reproducir cada tipo de solicitud que está realizando, pero satisface mis necesidades por el momento.


Usando Savon 2 lo hago de esta manera, escriba un método que devuelva el cuerpo de la solicitud del cliente.

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

esto no se menciona en la documentación

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


Savon usa HTTPI para ejecutar solicitudes SOAP. HTTPI es una interfaz común sobre varios clientes de Ruby HTTP. Probablemente podrías burlar / resguardar la solicitud HTTP ejecutada por Savon a través de:

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

Tenga en cuenta que utilicé Mocha para burlar la solicitud SOAP, obtener el cuerpo HTTP y validarlo con algún método de validación (pseudo-código).

Actualmente, Savon no admite la creación de solicitudes sin ejecutarlas. Entonces, la única manera de validar la solicitud sería interceptarla.

Si necesita que Savon admita esta función, hágamelo saber y abra un ticket en GitHub .

EDITAR: También hay savon_spec , que es un pequeño ayudante para las pruebas básicas basadas en dispositivos con Savon.