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.