2009-12-22 2 views
3

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

<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 и идентификатор сайта, чтобы убедиться, что они такие, какими они должны быть.

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

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

ответ

6

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

Создать свой 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. Все остальные функции в классе проверяют, будет ли эта переменная истинна перед продолжением, а если нет, то вызывается SOAPFault.

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

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

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

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

Смежные вопросы