2016-04-21 5 views
0

Я использую PERL и SOAP :: Lite для совершения мыльных вызовов веб-сервисов MS Exchange. Я уже выяснил аутентификацию и использую токен Oauth для совершения звонков. Я пытаюсь вызвать GetInboxRules, который задокументирован here.EWS SOAP Запросы не работают

В основном вызов должен выглядеть следующим образом.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
     xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
     xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Header> 
    <t:RequestServerVersion Version="Exchange2010_SP1" /> 
    </soap:Header> 
    <soap:Body> 
    <m:GetInboxRules> 
     <m:MailboxSmtpAddress>[email protected]</m:MailboxSmtpAddress> 
    </m:GetInboxRules> 
    </soap:Body> 
</soap:Envelope> 

Моя первая попытка используется следующий код:

my $client = SOAP::Lite->service('file://home/auth/work/src/ben/services.wsdl')->proxy('https://outlook.office365.com/EWS/Exchange.asmx'); 
$client->readable(1)->autotype(0)->outputxml('true'); 
$client->ns('http://schemas.microsoft.com/exchange/services/2006/messages', 'm'); 

my $ua = $client->schema->useragent; 
$ua->default_header('Authorization' => $auth_header); 
$ua->default_header('Content-Type' => 'application/xml'); 
$client->schema->useragent($ua); 

$client->transport->http_request->headers->push_header('Authorization'=> $auth_header); 

# WITH URI 
my $som = $client->call('GetInboxRules', SOAP::Data->name('MailboxSmtpAddress')->value('[email protected]')->uri('http://schemas.microsoft.com/exchange/services/2006/messages')); 

Это дало следующие XML наряду с ошибкой 500 внутреннего сервера с указанием:

«Сбой запроса проверки схемы: Элемент ' GetInboxRules 'в пространстве имен' http://schemas.microsoft.com/exchange/services/2006/messages 'имеет недопустимый дочерний элемент' MailboxSmtpAddress '. Список ожидаемых элементов:' MailboxSmtpAddress 'в пространстве имен' http://schemas.microsoft.com/exchange/services/2006/messages '"

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
    <m:GetInboxRules> 
     <MailboxSmtpAddress>[email protected]</MailboxSmtpAddress> 
    </m:GetInboxRules> 
    </soap:Body> 
</soap:Envelope> 

Я уже установка пространства имен, но, чтобы попытаться исправить это я указал имена пространства для элемента MailboxSmtpAddress путем добавления Uri спецификации к нему my $som = $client->call('GetInboxRules', SOAP::Data->name('MailboxSmtpAddress')->value('[email protected]')->uri('http://schemas.microsoft.com/exchange/services/2006/messages'));

который произвел:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:namesp3="http://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
    <m:GetInboxRules> 
     <namesp3:MailboxSmtpAddress xmlns:namesp3="http://schemas.microsoft.com/exchange/services/2006/messages">[email protected]</namesp3:MailboxSmtpAddress> 
    </m:GetInboxRules> 
    </soap:Body> 
</soap:Envelope> 

последовал по запросу 400 Bad Request. Я предполагаю, что ответ с плохим запросом связан с URL-адресом, включенным в тег MailboxSmtpAddress, но я не знаю, как еще указать пространство имен.

Это мой первый опыт работы с SOAP, поэтому любые предложения были бы очень оценены.

ответ

0

Святой пришел мне на помощь и подарил мне со следующим кодом:

my $client = SOAP::Lite 
    ->readable(1) 
    ->proxy('https://outlook.office365.com/EWS/Exchange.asmx') 
    ->ns('http://schemas.microsoft.com/exchange/services/2006/types', 'typ') 
    ->ns('http://schemas.microsoft.com/exchange/services/2006/messages', 'mes') 
    ->envprefix('soapenv') 
    ->autotype(0); 

$client->serializer->{'_attr'}{'{http://schemas.xmlsoap.org/soap/envelope/}encodingStyle'} = undef; 


$client->transport->default_header('Authorization' => $auth_header); 
$client->transport->default_header('X-AnchorMailbox' => '[email protected]'); 
$client->transport->default_header('X-OWA-ExplicitLogonUser' => '[email protected]'); 

my @header = (
    SOAP::Header->name('typ:RequestServerVersion')->attr({'Version' => 'Exchange2015'}), 
    SOAP::Header->name('typ:ExchangeImpersonation')->value(\SOAP::Header->name('typ:ConnectingSID') 
     ->value(\SOAP::Header->name('typ:SmtpAddress')->value('[email protected]'))) 
); 

my @param; 
my $method; 

@param = (
    SOAP::Data->name('mes:MailboxSmtpAddress', '[email protected]'), 
    ); 

$method = SOAP::Data->name('mes:GetInboxRules'); 

my $response = $client->call($method => (@param, @header)); 

print Dumper($response); 

Это привело в пространстве имен тега помещаются на элементах, передаваемых в вызове метода, а также исправлены некоторые проблемы, которые я имел с форматирование заголовка.

Ниже приводится XML, который пришел из этого кода:

<soapenv:Envelope 
    xmlns:mes="http://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:typ="http://schemas.microsoft.com/exchange/services/2006/types" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Header> 
    <typ:RequestServerVersion Version="Exchange2015" /> 

    <typ:ExchangeImpersonation> 
     <typ:ConnectingSID> 
     <typ:SmtpAddress>[email protected]</typ:SmtpAddress> 
     </typ:ConnectingSID> 
    </typ:ExchangeImpersonation> 
    </soapenv:Header> 

    <soapenv:Body> 
    <mes:GetInboxRules> 
     <mes:MailboxSmtpAddress>[email protected]</mes:MailboxSmtpAddress> 
    </mes:GetInboxRules> 
    </soapenv:Body> 
</soapenv:Envelope> 

Это произвело успешный ответ от Microsoft.

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