php - SoapServer - нужно добавить пространство имен в ответе Soap
Мне нужно добавить пространство имен в ответе Soap. Я использую php и SoapServer. Мой ответ начинается так:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0">
И мне нужно, чтобы начать так:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="urn:query:request:v2.0" xmlns:ns2="urn:query:type:v2.0">
Мой код на PHP такой, и я не знаю, как продолжить:
class Service
{
// FUNCTIONS
}
$options= array('uri'=>'urn:query:request:v2.0',
'cache_wsdl' => WSDL_CACHE_NONE);
$server=new SoapServer("Service.wsdl",$options);
$server->setClass('Service');
$server->addFunction(SOAP_FUNCTIONS_ALL);
$server->handle();
Спасибо
1 ответ
Пространства имен динамически добавляются в тело ответа мыла. Пока в теле мыла нет элемента с необходимым пространством имен, он не появится. Вы должны заявить об этом в ответе. Вот простой пример.
Класс обработки запросов на мыло
В этом классе обычно определяются функции службы мыла. Здесь происходит волшебство. Вы можете инициировать объекты SoapVar с нужным им пространством имен.
class Response
{
function getSomething()
{
$oResponse = new StdClass();
$oResponse->bla = 'blubb';
$oResponse->yadda = 'fubar';
$oEncoded = new SoapVar(
$oResponse,
SOAP_ENC_OBJECT,
null,
null,
'response',
'urn:query:type:v2.0'
);
return $oEncoded;
}
}
С собственным классом PHP SoapVar вы можете добавлять пространства имен к узлу. Пятый параметр - это имя узла, а шестой параметр - это пространство имен, к которому принадлежит узел.
Мыльный сервер
$oServer = new SoapServer(
'/path/to/your.wsdl',
[
'encoding' => 'UTF-8',
'send_errors' => true,
'soap_version' => SOAP_1_2,
]
);
$oResponse = new Response();
$oServer->setObject($oResponse);
$oServer->handle();
Если сервисная функция getSomething
называется, ответ будет выглядеть следующим образом xml.
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="urn:query:type:v2.0">
<env:Body>
<ns1:Response>
<ns1:bla>blubb</ns1:yadda>
<ns1:blubb>fubar</ns1:blubb>
</ns1:Response>
</env:Body>
</env:Envelope>
Как вы можете видеть, пространство имен, которое мы предоставили объекту SoapVar, появляется в узле конверта ответа мыла.