He usado SOAP en Ruby cuando tuve que crear un falso servidor SOAP para mis pruebas de aceptación. No sé si esta fue la mejor manera de abordar el problema, pero funcionó para mí.
He usado Sinatra gem (Escribí sobre la creación de extremos de burla con Sinatra here) para el servidor y también Nokogiri para cosas de XML (SOAP está trabajando con XML).
Así que, para empezar, he creado dos archivos (por ejemplo, config.rb y responses.rb) en los que he puesto las respuestas predefinidas que devolverá el servidor SOAP. En config.rb He puesto el archivo WSDL, pero como una cadena.
@@wsdl = '<wsdl:definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
.......
</wsdl:definitions>'
En responses.rb he puesto muestras para que las respuestas servidor SOAP volverá para diferentes escenarios.
@@login_failure = "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<LoginResponse xmlns="http://tempuri.org/">
<LoginResult xmlns:a="http://schemas.datacontract.org/2004/07/WEBMethodsObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Error>Invalid username and password</a:Error>
<a:ObjectInformation i:nil="true"/>
<a:Response>false</a:Response>
</LoginResult>
</LoginResponse>
</s:Body>
</s:Envelope>"
Así que ahora déjame mostrarte cómo he creado el servidor.
require 'sinatra'
require 'json'
require 'nokogiri'
require_relative 'config/config.rb'
require_relative 'config/responses.rb'
after do
# cors
headers({
"Access-Control-Allow-Origin" => "*",
"Access-Control-Allow-Methods" => "POST",
"Access-Control-Allow-Headers" => "content-type",
})
# json
content_type :json
end
#when accessing the /HaWebMethods route the server will return either the WSDL file, either and XSD (I don't know exactly how to explain this but it is a WSDL dependency)
get "/HAWebMethods/" do
case request.query_string
when 'xsd=xsd0'
status 200
body = @@xsd0
when 'wsdl'
status 200
body = @@wsdl
end
end
post '/HAWebMethods/soap' do
request_payload = request.body.read
request_payload = Nokogiri::XML request_payload
request_payload.remove_namespaces!
if request_payload.css('Body').text != ''
if request_payload.css('Login').text != ''
if request_payload.css('email').text == some username && request_payload.css('password').text == some password
status 200
body = @@login_success
else
status 200
body = @@login_failure
end
end
end
end
Espero que le resulte útil.
Parte de la razón por la cual esto es "Perro lento" es que está construyendo el proxy cada vez que se conecta al servicio. Puede evitar este dolor usando wsdl2ruby para construir el proxy de forma permanente y luego llamar al proxy pregenerado. –
Podríamos, pero eso significaría instalar wsdl2ruby y demás. A veces Dog Slow está bien :-) –
Si necesita crear clases proxy para Savon, puede seguir [kredmer's] (https://github.com/kredmer/memotoo/blob/master/lib/memotoo/main.rb) enfoque de construir métodos de jabón sobre la marcha con la ayuda de SoapUI para poblar nombres de métodos y no tener que crear un analizador wsdl personalizado :). En lugar de almacenar todos los métodos en la memoria, puede escribir en el archivo, especialmente si tiene toneladas. – Dejan