Trabalhar com ações demoradas

Este artigo descreve como trabalhar com ações de longa duração ao usar APIs do Microsoft Graph. Algumas respostas da API exigem um tempo indeterminado para serem concluídas. Em vez de 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 prolongada. Esse padrão fornece ao aplicativo uma maneira de sondar atualizações de status em uma ação de execução prolongada, sem nenhuma solicitação aguardando a conclusão da ação.

O padrão geral envolve as seguintes etapas:

  1. Seu aplicativo solicita uma ação de execução longa por meio da API. A API aceita a ação e retorna uma 202 Accepted resposta junto com um Location cabeçalho para a URL da API para recuperar relatórios de status da ação.
  2. Seu aplicativo solicita a URL do relatório de status da ação e recebe uma resposta asyncJobStatus com o progresso da ação de execução prolongada.
  3. A ação de execução prolongada é concluída.
  4. Seu aplicativo solicita a URL do relatório de status da ação novamente e recebe uma resposta asyncJobStatus que mostra a conclusão da ação.

Pré-requisitos

As mesmas permissões necessárias para executar uma ação de execução longa também são necessárias para consultar o status de uma ação de execução prolongada.

Solicitação de ação inicial

O exemplo a seguir usa o método driveitem: copy . Nesse cenário, seu aplicativo faz uma solicitação para copiar uma pasta que contém uma grande quantidade de dados. É provável que essa solicitação leve vários segundos para ser concluída porque 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"
}

A API responde que a ação foi aceita e fornece a URL para recuperar o status da ação de longa execução.

HTTP/1.1 202 Accepted
Location: https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717

Observação: A URL de localização retornada pode não estar no ponto de extremidade da API do Graph.

Em muitos casos, essa etapa é o fim da solicitação, pois a ação de cópia é concluída sem nenhum outro trabalho do aplicativo. No entanto, se o aplicativo precisar mostrar o status da ação de cópia ou garantir que ela seja concluída sem erros, ele poderá fazer isso usando a URL do 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 do 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.

HTTP/1.1 202 Accepted
Content-type: application/json

{
  "operation": "ItemCopy",
  "percentageComplete": 27.8,
  "status": "inProgress"
}

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 é concluída. Desta vez, quando o aplicativo faz uma solicitação para a URL do monitor, a resposta é um redirecionamento para o resultado final da ação.

GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717

Quando a ação é concluída, a resposta do serviço monitor retorna a ID do recurso para os resultados.

HTTP/1.1 202 Accepted
Content-type: application/json

{
    "percentageComplete": 100.0,
    "resourceId": "01MOWKYVJML57KN2ANMBA3JZJS2MBGC7KM",
    "status": "completed"
}

Recuperar os resultados da operação concluída

Quando o trabalho é concluído, a URL do monitor retorna a ID de recurso do resultado. Nesse caso, é a nova cópia do item original. O exemplo a seguir mostra como você pode resolver esse novo item usando a ID do recurso.

GET https://graph.microsoft.com/beta/me/drive/items/{item-id}
HTTP/1.1 200 OK
Content-type: application/json

{
    "id": "",
    "name": "Copy of LargeFolder1",
    "folder": { },
    "size": 12019
}

Recursos com suporte

Há suporte para ações de execução prolongada nos métodos a seguir.

Recurso API
driveItem copy