Получение MIME-версии сообщения приводит к ошибке «Метод 405 не разрешен» - Ошибка - PullRequest
0 голосов
/ 16 октября 2019

Моя компания запускает веб-приложение, которое считывает общий почтовый ящик и показывает контент пользователям. До сих пор он был основан на PHP-EWS. Поскольку мы перемещаем почтовый ящик в облако, мы должны перенести это приложение в MS-Graph. Я уже перенес львиную долю приложения, но теперь я сталкиваюсь с проблемой, когда пытаюсь получить MIME-версию сообщения.

Получение обработанной версии сообщения вообще не проблема. Запрос на это будет выглядеть примерно так:

GET /users/{mailbox-id}/mailfolders/inbox/messages/{message-id}

Согласно документации, я должен добавить "/ $ value" в конце "обычного" запроса, чтобы получить mime-версию сообщения. Это прекрасно работает на веб-сайте Microsoft Graph-Tester. В моем приложении я также могу без проблем запросить MIME-версию сообщения ATTACHED (работает с тем же трюком "/ $ value"). Но если я запрашиваю MIME-версию (обычного) сообщения NOT-ATTACHED, я получаю следующую ошибку:

Fatal error: Uncaught GuzzleHttp\Exception\ClientException: Client error: `GET https://graph.microsoft.com/v1.0/users/{mailbox-id}/mailfolders/inbox/messages/{message-id}/%24value` 
resulted in a `405 Method Not Allowed` response: { "error": { "code": "ErrorInvalidRequest", "message": "The OData request is not supported.", "innerEr (truncated...) in D:\wwwroot\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php:113 
Stack trace: #0 D:\wwwroot\vendor\guzzlehttp\guzzle\src\Middleware.php(66): GuzzleHttp\Exception\RequestException::create(Object(GuzzleHttp\Psr7\Request), Object(GuzzleHttp\Psr7\Response)) 
#1 D:\wwwroot\vendor\guzzlehttp\promises\src\Promise.php(203): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response)) 
#2 D:\wwwroot\vendor\guzzlehttp\promises\src\Promise.php(156): GuzzleHttp\Promise\Promise::callHand in D:\wwwroot\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php on line 113

Я использовал следующий код:

$graph = new Graph();
$graph->setAccessToken($tokenCache->getAccessToken());
 /** @var  $contentStream GuzzleHttp\Psr7\Stream */
$getMessageContentUrl = '/users/' . $mailbox . '/mailfolders/inbox/messages/' . $messageId.'/%24value';
try {
    $contentStream = $graph->createRequest('GET', $getMessageContentUrl)
            ->setReturnType("GuzzleHttp\Psr7\Stream")
            ->execute();
} catch (GraphException $e) {
            [...]
}

return $contentStream->getContents();

То же самоекод работает, если я запрашиваю MIME-версию прикрепленного сообщения.

Я думал о проблемах urlencoding, поэтому я попытался "/ $ value" и "/% 24value", тот же результат.

Не думаю, что это проблема с разрешениями. OAUTH_SCOPES:

'openid profile offline_access User.Read Mail.Read Mail.Read.Shared Mail.ReadWrite Mail.ReadWrite.Shared Calendars.Read Calendars.Read.Shared'

Так что я думаю, что учетная запись должна иметь более чем достаточно разрешений для выполнения этой задачи.

Я понятия не имею, если я делаю что-то неправильно или этопроблема Graph-API или Graph-PHP-SDK или Guzzle-Http-Client. Я использую следующие версии:

"name": "microsoft / microsoft-graph", "version": "1.11.0",

"name": "guzzlehttp / guzzle"," версия ":" 6.3.3 ",

" имя ":" guzzlehttp / psr7 "," версия ":" 1.6.1 ",

Я был бы очень рад, есликто-то может помочь мне или, по крайней мере, поставить меня на правильный путь.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Я нашел решение. Пришлось заменить

GET /users/{mailbox-id}/mailfolders/inbox/messages/{message-id}/$value

на

GET /users/{mailbox-id}/messages/{message-id}/$value

тогда все заработало. Довольно странно, что другие запросы с "/ mailfolders / inbox /" работали, но этот не так. Как бы то ни было, пока это работает.

0 голосов
/ 16 октября 2019

Ошибка «Метод не разрешен» означает, что запрашиваемый маршрут существует, но не для метода, который вы используете (GET). Попробуйте заменить метод GET на POST, например:

$contentStream = $graph->createRequest('POST', $getMessageContentUrl)
        ->setReturnType("GuzzleHttp\Psr7\Stream")
        ->execute();

Помните, что маршруты api указывают разрешенные методы (GET, POST, PUT, PATCH, DELETE);

...