SOAP'u Ruby'de, kabul testleri için sahte bir SOAP sunucusu yapmam gerektiğinde kullandım. Soruna yaklaşmanın en iyi yolu bu mu bilmiyorum ama benim için işe yaradı.
Sunucu için Sinatra gem ( burada Sinatra ile alaycı uç noktalar oluşturma hakkında yazdım ) ve ayrıca XML için Nokogiri (SOAP XML ile çalışıyor) kullandım.
Bu yüzden, başlangıç için, SOAP sunucusunun geri döneceği önceden tanımlanmış cevapları koyduğum iki dosya (ör. Config.rb ve responses.rb) oluşturdum. Gelen config.rb Ben WSDL dosyası koymak, ama bir dize olarak var.
@@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>'
Gelen responses.rb Ben SABUN sunucusu farklı senaryolar için geri döneceği yanıtlar için koymak örnekleri var.
@@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>"
Şimdi size sunucuyu nasıl yarattığımı göstermeme izin verin.
require 'sinatra'
require 'json'
require 'nokogiri'
require_relative 'config/config.rb'
require_relative 'config/responses.rb'
after do
headers({
"Access-Control-Allow-Origin" => "*",
"Access-Control-Allow-Methods" => "POST",
"Access-Control-Allow-Headers" => "content-type",
})
content_type :json
end
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
Umarım bunu faydalı bulursunuz!