我需要使用WSDL处理外部SOAP服务。有效请求(简化)的示例是:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<RunCommand xmlns="https://me.com/MyService">
<request>
<Credentials>
<User>jack</User>
<Password>abc123</Password>
</Credentials>
<Command xsi:type="SomeCommand">
<Foo>bar</Foo>
</Command>
</request>
</RunCommand>
</soap:Body>
</soap:Envelope>
问题是根据WSDL,Command
元素是抽象的CommandType
类型,所以我需要指定xsi:type
。我知道如何使用SoapVar
,但似乎我使用SoapVar
,所有WSDL模式自动化都消失了。
对于简单的WSDL,这就足够了:
$soapClient->RunCommand([
'Request' => [
'Credentials' => [
'user' => 'jack',
'password' => 'abc123',
],
'Command' => [
'Foo' => 'bar'
]
]
]);
但在这种情况下,我得到了例外:
指定的类型是abstract:name =&#39; CommandType&#39;
我知道如何为Command
制作SoapClient
元素,但我不确定如何将它们混合在一起。我试过这个:
$soapClient->RunCommand([
'Request' => [
'Credentials' => [
'user' => 'jack',
'password' => 'abc123',
],
new SoapVar(
['Foo' => 'bar'],
SOAP_ENC_OBJECT,
'CommandType',
null,
'Command'
)
]
]);
但它并没有创建我需要的请求。如何使用SoapClient形成我需要的请求以尽可能多地保留WSDL好处?