Algumas respostas de API exigem tempo indeterminado para serem concluídas.
Em vez de ter que esperar até que a ação seja concluída antes de retornar uma resposta, o Microsoft Graph pode usar um padrão de ações de execução longa.
Esse padrão fornece ao seu aplicativo uma maneira de sondar status atualizações em uma ação de execução longa, sem qualquer solicitação aguardando a conclusão da ação.
O padrão geral segue estas etapas:
O aplicativo solicita uma ação de execução longa por meio da API. A API aceita a ação e retorna uma resposta 202 Accepted junto com um cabeçalho de Local para que a URL de API recupere relatórios de status de ação.
O aplicativo solicita a URL de relatório de status de ação e recebe uma resposta AsyncJobStatus com o progresso da ação de execução longa.
A ação de execução longa é concluída.
O aplicativo solicita a URL de relatório de status da ação novamente e recebe uma resposta AsyncJobStatus que mostra a conclusão da ação.
Solicitação de ação inicial
Vamos percorrer as etapas para obter um cenário de exemplo de DriveItem Copy.
Neste cenário, o aplicativo solicita a cópia de uma pasta que contém uma grande quantidade de dados.
Essa solicitação provavelmente levará vários segundos para ser concluída, pois a quantidade de dados é grande.
POST https://graph.microsoft.com/beta/me/drive/items/{folder-item-id}/copy
Content-Type: application/json
{
"parentReference": {
"path": "/drive/root:/Documents"
},
"name": "Copy of LargeFolder1"
}
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Beta.Drives.Item.Items.Item.Copy;
using Microsoft.Graph.Beta.Models;
var requestBody = new CopyPostRequestBody
{
ParentReference = new ItemReference
{
Path = "/drive/root:/Documents",
},
Name = "Copy of LargeFolder1",
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Copy.PostAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc-beta drives items copy post --drive-id {drive-id} --drive-item-id {driveItem-id} --body '{\
"parentReference": {\
"path": "/drive/root:/Documents"\
},\
"name": "Copy of LargeFolder1"\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
com.microsoft.graph.beta.drives.item.items.item.copy.CopyPostRequestBody copyPostRequestBody = new com.microsoft.graph.beta.drives.item.items.item.copy.CopyPostRequestBody();
ItemReference parentReference = new ItemReference();
parentReference.setPath("/drive/root:/Documents");
copyPostRequestBody.setParentReference(parentReference);
copyPostRequestBody.setName("Copy of LargeFolder1");
var result = graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").copy().post(copyPostRequestBody);
<?php
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Graph\Generated\Models\CopyPostRequestBody;
use Microsoft\Graph\Generated\Models\ItemReference;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new CopyPostRequestBody();
$parentReference = new ItemReference();
$parentReference->setPath('/drive/root:/Documents');
$requestBody->setParentReference($parentReference);
$requestBody->setName('Copy of LargeFolder1');
$result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byDriveItemId('driveItem-id')->copy()->post($requestBody)->wait();
Observação: o local da URL retornado pode não estar no ponto de extremidade da API do Microsoft Graph.
Em muitos casos, esse pode ser o fim da solicitação, pois a ação de cópia será concluída sem que o aplicativo realize tarefas adicionais.
No entanto, se o aplicativo precisar mostrar o status da ação de cópia ou garantir que ela seja concluída sem erros, poderá fazer isso usando a URL de monitor.
Recuperar um relatório de status da URL de monitor
Para verificar o status da ação de cópia, o aplicativo faz uma solicitação para a URL fornecida na resposta anterior.
Observação: Essa solicitação não requer autenticação, pois a URL é de curta duração e exclusiva para o chamador original.
GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717
O serviço responde com a informação de que a ação de execução longa ainda está em andamento:
As informações podem ser usadas para fornecer uma atualização ao usuário sobre o progresso da ação de cópia.
O aplicativo pode continuar a sondar a URL de monitor para solicitar atualizações de status e acompanhar o andamento da ação.
Recuperar um relatório de status concluído da URL de monitor
Após alguns segundos, a operação de cópia foi concluída.
Dessa vez, quando o aplicativo faz uma solicitação para a URL de monitor, a resposta é um redirecionamento para o resultado concluído da ação.
GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717
Após a conclusão da ação, a resposta do serviço de monitor retornará a resourceId para obter os resultados.
Depois que o trabalho for concluído, a URL do monitor retornará o resourceId do resultado. Neste caso, trata-se da nova cópia do item original.
Você pode resolver esse novo item usando resourceId; por exemplo:
GET https://graph.microsoft.com/beta/me/drive/items/{item-id}
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].GetAsync();
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
DriveItem result = graphClient.drives().byDriveId("{drive-id}").items().byDriveItemId("{driveItem-id}").get();
As mesmas permissões que são necessárias para realizar uma ação de execução longa também são necessárias para consultar o status de uma ação de execução longa.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulte https://aka.ms/ContentUserFeedback.