Ich habe SOAP in Ruby verwendet, als ich für meine Abnahmetests einen gefälschten SOAP-Server erstellen musste. Ich weiß nicht, ob dies der beste Weg war, um das Problem anzugehen, aber es hat bei mir funktioniert.
Ich habe Sinatra Juwel verwendet (Ich schrieb über spöttischen Schaffung Endpunkte mit Sinatra hier ) für Server und auch Nokogiri für XML Material (SOAP ist die Arbeit mit XML).
Daher habe ich zu Beginn zwei Dateien erstellt (z. B. config.rb und answers.rb), in die ich die vordefinierten Antworten eingefügt habe, die der SOAP-Server zurückgeben wird. In config.rb habe ich die WSDL-Datei aber als String abgelegt.
@@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>'
In answers.rb habe ich Beispiele für Antworten eingefügt, die der SOAP-Server für verschiedene Szenarien zurückgibt.
@@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>"
Lassen Sie mich Ihnen nun zeigen, wie ich den Server tatsächlich erstellt habe.
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
Ich hoffe, Sie finden das hilfreich!