Обрабатывать 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
подход выше. Просто один на один с людьми.