Я действительно борюсь с этой проблемой. Когда 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);