我正在使用我正在使用的肥皂服务之一 . 我正在使用 soap4r
来消费肥皂服务 . 但不知何故,他们期待的不是我发送的东西 . 这是我发送的内容:
<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<authenticate env:mustUnderstand="0">
<username>USERNAME</username>
<apiKey>API_KEY</apiKey>
</authenticate>
<SoftLayer_Network_Media_Transcode_AccountInitParameters env:mustUnderstand="0">
<id>ID</id>
</SoftLayer_Network_Media_Transcode_AccountInitParameters>
<SoftLayer_Network_Media_Transcode_AccountObjectFilter env:mustUnderstand="0">
<transcodeJobs>
<transcodeStatus>
<name>
<operation>Complete</operation>
</name>
</transcodeStatus>
</transcodeJobs>
</SoftLayer_Network_Media_Transcode_AccountObjectFilter>
</env:Header>
<env:Body>
<n1:getTranscodeJobs xmlns:n1="http://api.service.softlayer.com/soap/v3/"
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</n1:getTranscodeJobs>
</env:Body>
</env:Envelope>
哪个不返回所需的输出 . 他们期望的是:
<?xml version="1.0" encoding="utf-8" ?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:n1="http://api.service.softlayer.com/soap/v3/"
env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<env:Header>
<authenticate env:mustUnderstand="0">
<username>USER_NAME</username>
<apiKey>API_KEY</apiKey>
</authenticate>
<SoftLayer_Network_Media_Transcode_AccountInitParameters env:mustUnderstand="0">
<id>id</id>
</SoftLayer_Network_Media_Transcode_AccountInitParameters>
<n1:SoftLayer_Network_Media_Transcode_AccountObjectFilter env:mustUnderstand="0">
<transcodeJobs>
<transcodeStatus>
<name>
<operation>Complete</operation>
</name>
</transcodeStatus>
</transcodeJobs>
</n1:SoftLayer_Network_Media_Transcode_AccountObjectFilter>
</env:Header>
<env:Body>
<n1:getTranscodeJobs >
</n1:getTranscodeJobs>
</env:Body>
</env:Envelope>
根目录中的命名空间和编码样式(因为它们在头ObjectFilter中使用它) . soap4r正在生成上一个请求,我无法将其更改为实际工作的后一个请求 .
以下是我使用soap4r的方法:
class SLHeader < SOAP::Header::SimpleHandler
def initialize(tag, out)
@out = out
super(XSD::QName.new(nil, tag))
end
def on_simple_outbound
@out
end
end
SOAP_WSDL_ENDPOINT = "endpoint"
service = "service name"
initParams = {'id' => ID}
objectFilter = {'transcodeJobs' => {'transcodeStatus' => {'name' => {'operation' => STATUS}}}}
driver = SOAP::WSDLDriverFactory.new(SOAP_WSDL_ENDPOINT + service + "?wsdl").create_rpc_driver
driver.headerhandler << SLHeader.new('authenticate', {'username' => @auth_user, 'apiKey' => @auth_key})
driver.headerhandler << SLHeader.new(service + 'InitParameters', initParam)
driver.headerhandler << SLHeader.new(service + 'ObjectFilter', objectFilter)
1 回答
我 strongly 建议你不要浪费太多时间
soap4r
.如果它有效,那就太棒了 . 但是,如果你的SOAP服务有特殊的期望或者以某种方式被打破,那么它绝对没用(如果没有大量的猴子补丁,就无法修复) . 库的内部状态也很糟糕,它在Ruby 1.9中不起作用 .
对于SOAP接口,我已经开始使用handsoap,它允许您手动构造SOAP消息,这些消息正是您的服务所期望的 . 这是一个更多的工作,但它给我带来了很多类似于你的头痛 . 它也适用于Ruby 1.9 . 我没有回头 .