我尝试制作的示例请求如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetList xmlns="http://tempuri.org/">
<listRequest i:type="b:NpsListRequest" xmlns:a="http://schemas.datacontract.org/2004/07/Services.List" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Services.List.Strategies">
<a:id>1</a:id>
</listRequest>
</GetList>
</s:Body>
</s:Envelope>
我可以使用Nokogiri完全复制,就像这样:
builder = Nokogiri::XML::Builder.new do |xml|
xml['s'].Envelope('xmlns:s' => "http://schemas.xmlsoap.org/soap/envelope/") {
xml['s'].Body {
xml.GetList('xmlns' => "http://tempuri.org/") {
xml.listRequest('i:type' => "b:NpsListRequest", 'xmlns:a' => "http://schemas.datacontract.org/2004/07/Services.List", 'xmlns:i' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:b' => "http://schemas.datacontract.org/2004/07/Services.List.Strategies") {
xml['a'].id(1)
}
}
}
}
end
builder.to_xml
然后,我使用Savon构建我的soap_client:
def soap_client
soap_client = Savon.client(
wsdl: "http://1.1.1.1/Api.svc?wsdl", #PLE
headers: {"Authorization" => "Basic"},
basic_auth: ['user', 'password'],
env_namespace: :soapenv,
namespace_identifier: :ser,
ssl_verify_mode: :none,
log: true,
:pretty_print_xml => true
)
end
现在,我需要进行一次:get_list
调用,看起来像上面的示例请求。
soap_client.operations
会返回此信息:
[:get_list]
所以我知道我已经过身份验证,客户端工作正常。
我无法弄清楚如何实际进行:get_list
通话。
我想要一些简单的东西,我甚至不必使用Nokogiri
来构建我自己的xml,如下所示:
soap_client.call :get_list, message: {id => 1}
但这似乎不是一个可行的解决方案。关于我如何将使用Nokogiri构建的XML传递给我:get_list
的{{1}}调用的任何想法?我也对其他建议持开放态度。