Обрабатывать SOAP-заголовки в PHP - PullRequest
3 голосов
/ 22 декабря 2009

Я создаю (на 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 Ответ

7 голосов
/ 23 декабря 2009

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

Создайте свой 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.

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

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

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

...