Обрабатывать SOAP-заголовки в PHP

Я строю (на PHP) SOAP-сервер, настроенный его WSDL для приема сообщений, которые выглядят так:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="https://my.awesome.namespace/">
    <SOAP-ENV:Header>
        <ns1:Header>
            <ns1:APIKey>E4C5BDE0-48DC-543C-1CA3-8E55C63F8E60</ns1:APIKey>
            <ns1:SiteID>111</ns1:SiteID>
        </ns1:Header>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <ns1:Heartbeat>
            <ns1:Message>Hello world.</ns1:Message>
        </ns1:Heartbeat>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

У меня не было проблем с получением моего SOAPServer для обработки сообщений Heartbeat - $server->addFunction("Heartbeat"); работает отлично. Я хочу, однако, чтобы иметь возможность обрабатывать содержимое <ns1:Header> Вложение - так что я могу проверить ключ API и идентификатор сайта, чтобы убедиться, что они должны быть.

Я посмотрел здесь, (и, конечно, в другом месте), но респондент, кажется, упустил суть вопроса. Кто-нибудь знает, как я могу получить доступ к элементу заголовка для проверки? Должен ли я добавить функцию для заголовка так же, как метод в теле? ($server->addFunction("Header");?)

Большое спасибо заранее.

1 ответ

Решение

Нашел это! Вот что ты делаешь.

Создайте свой SOAP-сервер:

$server = new SoapServer($your_wsdl,$any_options);
$server->setClass($name_of_your_class);
$server->handle($location_of_request_data);

Класс, названный в $name_of_your_classв дополнение к содержанию функций для каждой услуги, определенной в $your_wsdl, также должен содержать функцию с именем для того, что у вас есть в <SOAP-ENV:Header> корпус тега. я имею <ns1:Header>, так что моя функция названа Header, Поместите туда любую логику, которая вам нужна. Для меня я хотел проверить ключ API и идентификатор сайта, поэтому я создал личную переменную, и, если ключ API и идентификатор сайта верны, для переменной задано значение true. Все остальные функции в классе проверяют, имеет ли эта переменная значение true, прежде чем продолжить, и, если нет, SOAPFault брошен

Надеюсь, что это поможет любому, кто сталкивается с этим вопросом в Google.

PS: для функций в классе, определенном в $server->setClass(), не забывайте, что они должны принимать аргументы в порядке, определенном в WSDL. Это сбило меня с толку.

Удачи всем другим разработчикам PHP/SOAP - похоже, нам всем это нужно.

Edit / PPS: по какой-либо причине, просто позвонив $server->addFunction("Header") у меня не получилось - я попробовал это прежде, чем попробовал setClass подход выше. Просто один на один с людьми.

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