Форматирование SoapRequest в PHP нативном soapClient - PullRequest
1 голос
/ 21 февраля 2020

Странная ситуация с использованием SoapClient У меня есть следующий код для запуска простого soap запроса.

        $client = new \SoapClient($this->wsdlURI, [
            'trace' => 1,
            'cache_wsdl' => WSDL_CACHE_NONE,
            'soap_version' => 'SOAP_1_2',
            'features' => SOAP_SINGLE_ELEMENT_ARRAYS|SOAP_USE_XSI_ARRAY_TYPE
        ]);
        $request = [
            'dataRequest' => [
                'UserId' => '***',
                'AccountNumber' => (string) $customer->getAccountNumber(),
                'PremiseAddress' => [
                    'ZipCode' => (string) $customer->getZip()
                ]
            ]
        ];
        try {
            $return = $client->searchAccounts($request);
        } catch (\SoapFault $fault) {
          ...
        }

Я ожидаю, что запрос будет выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://com/dom/ec/services" xmlns:java="java:com.dom.ec.beans">
    <soapenv:Header/>
    <soapenv:Body>
        <ser:searchAccounts>
            <ser:dataRequest>
                <java:UserId>***</java:UserId>
                <java:AccountNumber>00000000</java:AccountNumber>
                <java:PremiseAddress>
                    <java:ZipCode>00000</java:ZipCode>
                </java:PremiseAddress>
            </ser:dataRequest>
        </ser:searchAccounts>
    </soapenv:Body>
</soapenv:Envelope>

Вместо этого или отформатирован так:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://cso.dom.com/ecservices/">
    <SOAP-ENV:Body>
        <ns1:SearchAccounts>
            <ns1:dataRequest>
                <item>
                    <key>UserId</key>
                    <value>***</value>
                </item>
                <item>
                    <key>AccountNumber</key>
                    <value>0000000000</value>
                </item>
                <item>
                    <key>PremiseAddress</key>
                    <value>
                        <item>
                            <key>ZipCode</key>
                            <value>00000</value>
                        </item>
                    </value>
                </item>
            </ns1:dataRequest>
        </ns1:SearchAccounts>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Есть ли опция, которую я пропускаю?

1 Ответ

0 голосов
/ 24 апреля 2020

Я понял, что мне не хватало разумного использования SoapVar с использованием StdClass, а не ассоциативных массивов.

Окончательный код выглядел так:

$client = new \SoapClient($this->wsdlURI, [
    'trace' => 1,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'soap_version' => 'SOAP_1_2',
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS|SOAP_USE_XSI_ARRAY_TYPE
]);
$premiseAddress = new \stdClass();
$premiseAddress->ZipCode = (string) $customer->getZip();
$dataRequest = new \stdClass();
$dataRequest->AccountNumber = (string) $customer->getAccountNumber();
$dataRequest->CompanyNumber = '04';
$dataRequest->UserId = 'EFI';
$dataRequest->PremiseAddress = new \SoapVar($premiseAddress, SOAP_ENC_OBJECT);
$searchRequest = new \stdClass();
$searchRequest->dataRequest = new \SoapVar($dataRequest, SOAP_ENC_OBJECT);
...