Я новичок в SOAP и пытаюсь отформатировать SOAP-ответ, используя класс SoapServer PHP.
Возможно, было бы полезно знать, что это для службы обратного вызова подписки EWS Push Subscription и что я использую библиотеку php-ews . Мне удалось подписаться на подписку EWS Push, но у меня возникли проблемы с форматированием ответа, который EWS ожидает от моей службы обратного вызова.
Мне нужен следующий ответ SOAP, возвращаемый моей службой SOAP PHP:
<s:Envelope xmlns:s= "http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <SendNotificationResult xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"> <SubscriptionStatus>OK</SubscriptionStatus> </SendNotificationResult> </s:Body> </s:Envelope>
Вместо этого я получаю следующий результат:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://localhost/ioc/ebooking_v4/services/ews/notification.php" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:SendNotificationResponse> <return xsi:type="SOAP-ENC:Struct"> <SubscriptionStatus xsi:type="xsd:string">OK</SubscriptionStatus> </return> </ns1:SendNotificationResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Мой код службы PHP:
class ewsService { public function SendNotification( $arg ) { $result = new EWSType_SendNotificationResultType(); $result->SubscriptionStatus = 'OK'; return $result; } } $server = new soapServer( null, array( 'uri' => $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'], )); $server->setObject( new ewsService() ); $server->handle();
Вызов SOAP на мой сервис выглядит следующим образом:
<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"> <soap11:Header> <t:RequestServerVersion xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" Version="Exchange2010_SP2" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" /> </soap11:Header> <soap11:Body> <m:SendNotification xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"> <m:ResponseMessages> <m:SendNotificationResponseMessage ResponseClass="Success"> <m:ResponseCode>NoError</m:ResponseCode> <m:Notification> <t:SubscriptionId>GQBjaGNpb2ExODEuY2lvLm9seW1waWMub3JnEAAAAFgvEpJcS3JDkpvHOMgnX60FhmhpPInRCA==</t:SubscriptionId> <t:PreviousWatermark>AQAAAIiCiXu/q1ZPvYPyvRVVh5cajSoKAAAAAAA=</t:PreviousWatermark> <t:MoreEvents>false</t:MoreEvents> <t:StatusEvent> <t:Watermark>AQAAAIiCiXu/q1ZPvYPyvRVVh5cajSoKAAAAAAA=</t:Watermark> </t:StatusEvent> </m:Notification> </m:SendNotificationResponseMessage> </m:ResponseMessages> </m:SendNotification> </soap11:Body> </soap11:Envelope>
Поэтому я полагаю, что мой вопрос заключается в том, как изменить форматирование ответа SOAP с использованием класса PHP SoapServer? Нужно ли добавлять WSDL или передавать classmap в конструктор SoapServer?
Если нет способа сделать это с помощью класса SoapServer, есть ли другой способ сделать это, кроме создания буфера строк и передачи его обратно вручную?
Любая помощь будет принята с благодарностью.