Я использую 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, поэтому любые предложения были бы очень оценены.