PHP Soap Client如何处理complexTypes?

时间:2016-10-10 10:25:04

标签: php xml soap

我正在编写一个web服务并调用一个函数,但该函数只能理解我使用的前两个参数。

我的功能应该添加一个条目,其中包含 campaignName addressData 参数下提供的数据,并且会匹配“addressId”参数中的条目。我到目前为止唯一能做的就是在好的 campaignName 中插入一个带有正确 addressId 的空条目。

以下是该功能的说明:

<s:element name="ImportAddress">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="campaignName" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="addressId" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="addressData" type="tns:ArrayOfAddressDataItem"/>
        </s:sequence>
    </s:complexType>
</s:element>

复杂类型ArrayOfAddressDataItem:

<s:complexType name="ArrayOfAddressDataItem">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="unbounded" name="AddressDataItem" nillable="true" type="tns:AddressDataItem"/>
    </s:sequence>
</s:complexType>

复杂类型AddressDataItem

<s:complexType name="AddressDataItem">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="key" type="s:string"/>
        <s:element minOccurs="0" maxOccurs="1" name="value" type="s:string"/>
    </s:sequence>
</s:complexType>

这是我的PHP代码:

此请求调用返回成功:

$arr_import_address_params = array(
    'campaignName' => 'TEST - Liste des concessions',
    'addressId' => $addressId,
    'addressData' => array(array(
        'Civilite' => 'XXX',
        'Code_postal' => 'XXX',
        'Creation_date' => 'XXX',
        'Email' => 'XXX',
        'Nom' => 'XXX',
        'Prenom' => 'XXX',
        'Telephone' => 'XXX',
        'Ville' => 'XXX',
    ))
);

正如我之前所说,此成功调用会插入一个包含正确ID和campaignName的空条目。

但是这个(应该是正确的)会返回错误:

$arr_import_address_params = array(
    'campaignName' => 'TEST - Liste des concessions',
    'addressId' => $addressId,
    'addressData' => array(
        array('key' => 'Civilite', 'value' => 'XXX'),
        array('key' => 'Code_postal', 'value' => 'XXX'),
        array('key' => 'Creation_date', 'value' => 'XXX'),
        array('key' => 'Email', 'value' => 'XXX'),
        array('key' => 'Nom', 'value' => 'XXX'),
        array('key' => 'Prenom', 'value' => 'XXX'),
        array('key' => 'Telephone', 'value' => 'XXX'),
        array('key' => 'Ville', 'value' => 'XXX'),
    )
);

这是第二次通话的结果:

object(stdClass)#4(1){     [ “ImportAddressResult”] =&GT;     string(9)“Exception”   }

文档中的哪个意味着发生了未知错误。

以下是我提出请求的方式:

$options = array(
    "login" => "xxx",
    "password" => "xxx",
    "encoding" => "UTF-8",
    'trace' => 1,
    'exceptions' => 1
);

$client = new SoapClient("http://xxx/ImportExport/ImportExportWS.asmx?WSDL", $options);

$addressId = "TEST-WITH-UNEXISTING-ID";

$request_params = array(
    'campaignName' => 'TEST - Liste des concessions',
    'addressId' => $addressId,
    'addressData' => array(
        array('key' => 'Civilite', 'value' => 'XXX'),
        array('key' => 'Code_postal', 'value' => 'XXX'),
        array('key' => 'Creation_date', 'value' => 'XXX'),
        array('key' => 'Email', 'value' => 'XXX'),
        array('key' => 'Nom', 'value' => 'XXX'),
        array('key' => 'Prenom', 'value' => 'XXX'),
        array('key' => 'Telephone', 'value' => 'XXX'),
        array('key' => 'Ville', 'value' => 'XXX'),
    )
);

$request_result = $client->ImportAddress($request_params);

请求XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="xxx">
    <SOAP-ENV:Body>
        <ns1:ImportAddress>
            <ns1:campaignName>TEST - Liste des concessions</ns1:campaignName>
            <ns1:addressId>TEST-UNIQUE-IDENTIFIER</ns1:addressId>
            <ns1:addressData>
                <ns1:AddressDataItem>
                    <ns1:key>Civilite</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Code_postal</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Creation_date</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Email</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Nom</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Prenom</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Telephone</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
                <ns1:AddressDataItem>
                    <ns1:key>Ville</ns1:key>
                    <ns1:value>XXX</ns1:value>
                </ns1:AddressDataItem>
            </ns1:addressData>
        </ns1:ImportAddress>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我想知道我发送的类型是否有问题? 我读到某个地方我可以使用数组而不是对象,它似乎可以工作,直到它来到adressData参数。

我不知道为什么我做错了什么,我认为我的代码遵循WSDL描述,但似乎我忘记了......

任何帮助都将非常感激。

提前致谢, 森

0 个答案:

没有答案