2016-04-21 6 views
0

Ich verwende PERL und SOAP :: Lite, um Soap-Anrufe an MS Exchange Web Services zu machen. Ich habe bereits herausgefunden, authentifizieren und verwende ein Oauth-Token, um die Anrufe zu tätigen. Ich versuche, GetInboxRules aufzurufen, die here dokumentiert ist.EWS SOAP-Anfragen fehlgeschlagen

Grundsätzlich muss der Anruf so aussehen.

<?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> 

Mein erster Versuch verwendet den folgenden Code:

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')); 

Dies das folgende XML erzeugt zusammen mit einem 500 internen Server-Fehler, der besagt:

„Die Anfrage Schema-Validierung fehlgeschlagen: Das Element" GetInboxRules 'im Namespace' http://schemas.microsoft.com/exchange/services/2006/messages 'hat das ungültige untergeordnete Element' MailboxSmtpAddress '. Liste der möglichen erwarteten Elemente:' MailboxSmtpAddress 'im Namespace' 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> 

ich schon, aber den Namensraum setze dies zu versuchen und zu beheben I durch Zugabe einer uri Spezifikation es my $som = $client->call('GetInboxRules', SOAP::Data->name('MailboxSmtpAddress')->value('[email protected]')->uri('http://schemas.microsoft.com/exchange/services/2006/messages'));

die produzierte den Namen Raum für das MailboxSmtpAddress Element angegeben:

<?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> 

gefolgt durch eine 400 Bad Request Antwort. Ich vermute, dass die schlechte Anfrage Antwort wegen der URL in der MailboxSmtpAddress Tag enthalten ist, aber ich weiß nicht, wie sonst den Namespace anzugeben.

Dies ist mein erstes Mal mit SOAP arbeiten, so dass alle Vorschläge sehr geschätzt werden.

Antwort

0

Ein Heiliger kam zu meiner Rettung und stellte mich mit dem folgenden Code:

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); 

Das im Namespace-Tag in Folge auf die Elemente gelegt wird, um den Methodenaufruf übergeben wird und korrigiert auch einige Probleme hatte ich mit die Formatierung der Kopfzeile.

Im Folgenden ist der XML, die von diesem Code kam:

<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> 

Dieses eine erfolgreiche Antwort von Microsoft hergestellt.