승인 테스트를 위해 가짜 SOAP 서버를 만들어야 할 때 Ruby에서 SOAP를 사용했습니다. 이것이 문제에 접근하는 가장 좋은 방법인지는 모르겠지만 저에게 효과적이었습니다.
저는 Sinatra gem ( 여기서 Sinatra로 조롱 엔드 포인트를 만드는 방법에 대해 썼습니다 )을 서버에 사용하고 Nokogiri 를 XML 항목에 사용했습니다 (SOAP는 XML과 함께 작동합니다).
그래서 처음에는 SOAP 서버가 반환 할 미리 정의 된 답변을 넣은 두 개의 파일 (예 : config.rb 및 response.rb)을 만들었습니다. 에서 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
# 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
이 정보가 도움이 되셨기를 바랍니다.