PHP SOAP Client не добавляет пространство имен по умолчанию к параметрам запроса - PullRequest
0 голосов
/ 13 мая 2019

Я действительно борюсь с этой проблемой. Когда PHP SOAP генерирует XML, он не добавляет пространство имен по умолчанию, что приводит к ошибке сервера SOAP. Я не уверен, что делать здесь.

Я тестирую сгенерированный XML из PHP SOAP, он не работает, но когда я вручную добавляю xmlns по умолчанию, он работает как надо ...

Кто-нибудь знает, где проблема?

Вот пример файла XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:common="http://services.test.com/xsd/common/1.0" xmlns:gus="http://services.test.com/GetBalance" xmlns:rq="http://services.test.com/GetBalance"  targetNamespace="http://services.test.com/GetBalance" attributeFormDefault="unqualified">
    <xs:import namespace="http://services.test.com/xsd/common/1.0" schemaLocation="CommonService.xsd"/>
    <xs:element name="GetBalanceRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="common:RequestHeader"/>
                <xs:element xmlns="http://services.test.com/GetBalance" name="RequestBody">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="ServiceNumber" type="common:ServiceNumber"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

А вот и работает SOAP-запрос:

<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://services.test.com/xsd/common/1.0"
xmlns:ns2="http://services.test.com/GetBalance">
<SOAP-ENV:Body>
    <ns2:GetBalanceRequest>
        <ns1:RequestHeader>
            <ns1:TransactionId>027f5e30ee314f37a09e0949d0d0769f</ns1:TransactionId>
        </ns1:RequestHeader>
        <ns2:RequestBody>
            <ns2:ServiceNumber>11111</ns2:ServiceNumber>
        </ns2:RequestBody>
    </ns2:GetBalanceRequest>
</SOAP-ENV:Body>

А вот запрос, который генерирует PHP:

 <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns1="http://services.test.com/xsd/common/1.0"
xmlns:ns2="http://services.test.com/GetBalance">
<SOAP-ENV:Body>
    <ns2:GetBalanceRequest>
        <ns1:RequestHeader>
            <ns1:TransactionId>027f5e30ee314f37a09e0949d0d0769f</ns1:TransactionId>
        </ns1:RequestHeader>
        <RequestBody>
            <ServiceNumber>11111<ServiceNumber>
        </RequestBody>
    <ns2:/GetBalanceRequest>
</SOAP-ENV:Body>

Как видите, у тега RequestBody нет пространства имен по умолчанию (в данном примере ns2), и я не уверен, почему ... Ребята, скажите, как исправить эту ошибку ...?

Также вот код PHP, который я использую:

public function getRequest(): array
{

    return
        [
            $this->requestName => [
                'RequestHeader' => $this->getRequestHeader(),
                'RequestBody' => $this->getRequestBody(),
            ]
        ];
}

public function setClient()
{
    $factory = new Factory();
    $this->client = $factory->create(
        new Client([
            'cert' => $this->cert,
            'ssl_key' => $this->ssl_key
        ]),
        $this->wsdl,
        [
            'location' => $this->location,
            'uri' => 'http://services.test.com',
            'soap_version'=>SOAP_1_1,

        ]
    );

    return $this;
}

//Command that executes SOAP call based on https://github.com/meng-tian/async-soap-guzzle
this->getClient()->call($command, $request, $this->headers);
...