SoapClient не отображает правильный XML из SimpleXMLObject - PullRequest
2 голосов
/ 29 апреля 2019

У нас есть приложение, которое создает правильный XML-запрос в SimpleXML.При выводе этого с $element->asXml() я также получаю правильный XML.Однако при передаче объекта SimpleXML в soapclient он удалит все ключи в массиве.

Я пробовал несколько способов исправить это.Назначение ключей элементам.Несколько функций Soapclient и превращение всего в массив.Никакого результата.

Это абстрактная версия того, чего я пытаюсь достичь.

 $populate = new SimpleXMLElement('<Populate/>');
        $data = $populate->addChild('data');
        $roleKeysElement = $data->addChild('RoleKeys');
        $roleKeysElement->addChild('Operation', $settings[PopulateSettings::ROLE_KEYS] ?? Operations::MIRROR);

        $roleKeyElement1 = $roleKeysElement->addChild('RoleKey');
        $keyElement1 = $roleKeyElement1->addChild('Key');
        $certificateElement = 1->addChild('Certificate');
        $certificateElement->addChild('ValidUntil', 1);
        $certificateElement->addChild('Password', 2);
        $certificateElement->addChild('Thumbprint', 3);
        $certificateElement->addChild('Serial', 4);
        $certificateElement->addChild('Base64Data', 5);

        $roleKeyElement2 = $roleKeysElement->addChild('RoleKey');
        $keyElement2 = $roleKeyElement2->addChild('Key');
        $certificateElement = $keyElement2->addChild('Certificate');
        $certificateElement->addChild('ValidUntil', 1);
        $certificateElement->addChild('Password', 2);
        $certificateElement->addChild('Thumbprint', 3);
        $certificateElement->addChild('Serial', 4);
        $certificateElement->addChild('Base64Data', 5);

$response = $this->client->populate($populate);

В моем WSDL есть maxOccurence=Unbound для сертификата в этом случае.Но отправляется только 1 объект сертификата.Только первый.

Что я получаю от функции simpleXML asXml ():

<Populate>
    <data>
        <RoleKeys>
            <Operation>
                Mirror
            </Operation>
            <RoleKey>
                <Key>
                    <Certificate>
                        <ValidUntil>
                            1
                        </ValidUntil>
                        <Password>
                            2
                        </Password>
                        <Thumbprint>
                            3
                        </Thumbprint>
                        <Serial>
                            4
                        </Serial>
                        <Base64Data>
                            5
                        </Base64Data>
                    </Certificate>
                </Key>
            </RoleKey>
            <RoleKey>
                <Key>
                    <Certificate>
                        <ValidUntil>
                            1
                        </ValidUntil>
                        <Password>
                            2
                        </Password>
                        <Thumbprint>
                            3
                        </Thumbprint>
                        <Serial>
                            4
                        </Serial>
                        <Base64Data>
                            5
                        </Base64Data>
                    </Certificate>
                </Key>
            </RoleKey>
        </RoleKeys>
    </data>
</Populate>

Это правильно

Как мыльные клиенты отправляют

<Populate>
    <data>
        <RoleKeys>
            <Operation>
                Mirror
            </Operation>
            <RoleKey>
                <Key>
                    <Certificate>
                        <ValidUntil>
                            1
                        </ValidUntil>
                        <Password>
                            2
                        </Password>
                        <Thumbprint>
                            3
                        </Thumbprint>
                        <Serial>
                            4
                        </Serial>
                        <Base64Data>
                            5
                        </Base64Data>
                    </Certificate>
                </Key>
            </RoleKey>
        </RoleKeys>
    </data>
</Populate>

Чтобы дать немного больше контекста, вот часть WSDL этого запроса

<complexType name="KeyType">
    <sequence>
        <element minOccurs="0" maxOccurs="1" name="KeyUnlocks" type="s:string" />
        <choice minOccurs="1" maxOccurs="1">
            <element minOccurs="0" maxOccurs="1" name="Credentials">
                <complexType>
                    <sequence>
                        <element minOccurs="0" maxOccurs="1" name="Username" type="s:string" />
                        <element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
                    </sequence>
                </complexType>
            </element>
            <element minOccurs="0" maxOccurs="1" name="Certificate">
                <complexType>
                    <sequence>
                        <element minOccurs="1" maxOccurs="1" name="ValidUntil" type="s:dateTime" />
                        <element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
                        <element minOccurs="0" maxOccurs="1" name="Thumbprint" type="s:string" />
                        <element minOccurs="0" maxOccurs="1" name="Serial" type="s:string" />
                        <element minOccurs="0" maxOccurs="1" name="Base64Data" type="s:base64Binary" />
                    </sequence>
                </complexType>
            </element>
        </choice>
    </sequence>
</complexType>

1 Ответ

3 голосов
/ 01 мая 2019

Мы обнаружили, что это ошибка в php SoapClient в сочетании с SimpleXML.Когда вы делаете то же самое с передачей массива в SoapClient, XML форматируется правильно.Мы приведем к этому методу.В настоящее время нет способа отладки SoapClient.

[
            'data' => [
                'RoleKeys' => [
                    'Operation' => 'Mirror',
                    'RoleKey' => [
                        [
                            'ValidUntil' => 1,
                            'Password' => 2,
                            'Thumbprint' => 3,
                            'Serial' => 4,
                            'Base64Data' => 5,
                        ],
                        [
                            'ValidUntil' => 1,
                            'Password' => 2,
                            'Thumbprint' => 3,
                            'Serial' => 4,
                            'Base64Data' => 5,
                        ]
                    ]
                ]
            ]
        ]
...