我试图避免使用Nokogiri/Builder
来构建我的XML,而是希望在Ruby 2.0.0中使用Savon
gem。我有以下要求复制的请求:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<GetList xmlns="http://tempuri.org/">
<listRequest xmlns:a="http://schemas.datacontract.org/2004/07/Services.List"
i:type="b:NpsListRequest"
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>
到目前为止,我有这个:
def soap_client
soap_client = Savon.client(
wsdl: "http://10.10.10.10/ListApi.svc?wsdl"
headers: {"Authorization" => "Basic"},
basic_auth: ['username', 'password'],
env_namespace: :s,
ssl_verify_mode: :none,
log: true,
:pretty_print_xml => true
)
end
然后soap_client.call :get_list, message: {'id' => 1}
返回此信息:
<s:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tns="http://tempuri.org/"
xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<tns:GetList>
<id>1</id>
</tns:GetList>
</s:Body>
</s:Envelope>
我无法弄清楚如何完全复制第一个请求。 tns:
上的GetList
命名空间是错误的,我也无法复制<listRequest xmlns:a =
。关于如何在萨翁内做到这一点的任何想法?
答案 0 :(得分:1)
GetList上的命名空间是正确的。 你可能需要写的是
soap_client.call(:get_list,
:attributes => {'xmlns:b'=>'http://schemas.datacontract.org/'},
message: { 'ListRequest' => { 'tns:id' => 1 } }
这不是您问题的确切解决方案,因为我无法访问您的wsdl而无法测试。但是你应该得到解决方案的关键。