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, появляется в узле конверта ответа мыла.

Другие вопросы по тегам