ฉันใช้ SOAP ใน Ruby เมื่อฉันต้องสร้างเซิร์ฟเวอร์ SOAP ปลอมสำหรับการทดสอบการยอมรับของฉัน ฉันไม่รู้ว่านี่เป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาหรือไม่ แต่มันได้ผลสำหรับฉัน
ฉันใช้ Sinatra gem (ฉันเขียนเกี่ยวกับการสร้างจุดสิ้นสุดจำลองด้วย Sinatra ที่นี่ ) สำหรับเซิร์ฟเวอร์และNokogiriสำหรับสิ่ง XML (SOAP ทำงานร่วมกับ XML)
ดังนั้นในตอนแรกฉันได้สร้างไฟล์สองไฟล์ (เช่น config.rb และ responses.rb) ซึ่งฉันได้ใส่คำตอบที่กำหนดไว้ล่วงหน้าซึ่งเซิร์ฟเวอร์ SOAP จะส่งคืน ในconfig.rbฉันได้ใส่ไฟล์ WSDL แต่เป็นสตริง
@@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>'
ในresponses.rbฉันได้ใส่ตัวอย่างสำหรับการตอบสนองที่เซิร์ฟเวอร์ SOAP จะส่งคืนสำหรับสถานการณ์ต่างๆ
@@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>"
ตอนนี้ให้ฉันแสดงให้คุณเห็นว่าฉันสร้างเซิร์ฟเวอร์ได้อย่างไร
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
ฉันหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์!