如何在启用WSDL的SoapClient中处理抽象类型?

时间:2017-03-14 20:44:24

标签: php web-services soap soap-client

我需要使用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好处?

0 个答案:

没有答案