Tôi đã sử dụng SOAP trong Ruby khi tôi phải tạo một máy chủ SOAP giả cho các bài kiểm tra chấp nhận của mình. Tôi không biết đây có phải là cách tốt nhất để tiếp cận vấn đề hay không, nhưng nó đã hiệu quả với tôi.
Tôi đã sử dụng đá quý Sinatra (tôi đã viết về cách tạo điểm cuối giả mạo với Sinatra tại đây ) cho máy chủ và cả Nokogiri cho nội dung XML (SOAP đang làm việc với XML).
Vì vậy, ngay từ đầu, tôi đã tạo hai tệp (ví dụ: config.rb và responsees.rb), trong đó tôi đã đặt các câu trả lời được xác định trước mà máy chủ SOAP sẽ trả về. Trong config.rb, tôi đã đặt tệp WSDL, nhưng dưới dạng một chuỗi.
@@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>'
Trong responsees.rb, tôi đã đặt các mẫu phản hồi mà máy chủ SOAP sẽ trả về cho các tình huống khác nhau.
@@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>"
Vì vậy, bây giờ hãy để tôi chỉ cho bạn cách tôi đã thực sự tạo máy chủ.
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
Tôi hy vọng bạn sẽ thấy điều này hữu ích!