Trabajar con acciones de ejecución prolongada (beta)
Artículo
Algunas respuestas de API requieren un tiempo indeterminado para completarse.
En lugar de esperar hasta que se completa la acción antes de devolver una respuesta, Microsoft Graph puede usar un modelo de acciones de larga duración.
Este patrón proporciona a la aplicación una manera de sondear las actualizaciones de estado en una acción de larga duración, sin ninguna solicitud a la espera de que se complete la acción.
El modelo general sigue estos pasos:
La aplicación solicita una acción de larga duración mediante la API. La API acepta la acción y devuelve una respuesta 202 Accepted junto con un encabezado de ubicación para la dirección URL de la API para recuperar los informes de estado de la acción.
La aplicación solicita la dirección URL del informe de estado de la acción y recibe una respuesta AsyncJobStatus con el progreso de la acción de larga duración
Se completa la acción de larga duración.
La aplicación vuelve a solicitar la dirección URL del informe de estado de la acción y recibe una respuesta AsyncJobStatus en la que se muestra la finalización de la acción.
Solicitud de acción inicial
Vamos a recorrer los pasos para obtener un ejemplo del escenario copiar de DriveItem.
En este escenario, la aplicación solicita copiar una carpeta que contiene una gran cantidad de datos.
Esta solicitud probablemente tardará varios segundos en completarse ya que la cantidad de datos es 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
var graphClient = new GraphServiceClient(requestAdapter);
var requestBody = new Microsoft.Graph.Beta.Drives.Item.Items.Item.Copy.CopyPostRequestBody
{
ParentReference = new ItemReference
{
Path = "/drive/root:/Documents",
},
Name = "Copy of LargeFolder1",
};
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].Copy.PostAsync(requestBody);
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$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()->byItemId('driveItem-id')->copy()->post($requestBody);
Nota: La dirección URL devuelta no puede estar en el punto de conexión de la API de Microsoft Graph.
En muchos casos, esto puede ser el final de la solicitud, ya que la acción de copia se completará sin que la aplicación realice ningún trabajo adicional.
Sin embargo, si la aplicación necesita mostrar el estado de la acción de copia o asegurarse de que se completa sin errores, puede hacerlo mediante la dirección URL del monitor.
Recuperar un informe de estado desde la dirección URL de supervisión
Para comprobar el estado de la acción de copia, la aplicación realiza una solicitud a la dirección URL proporcionada en la respuesta anterior.
Nota: Esta solicitud no necesita autenticación, ya que la dirección URL es de corta duración y única para el autor de la llamada original.
GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717
El servicio responde con información de que la acción de larga duración todavía está en curso:
Esta información puede usarse para proporcionar una actualización al usuario sobre el progreso de la acción de copia.
La aplicación puede continuar sondeando la dirección URL de supervisión para solicitar actualizaciones de estado y mantener el seguimiento del progreso de la acción.
Recuperar un informe de estado completado desde la dirección URL de supervisión
Después de unos segundos, la operación de copia se ha completado.
Esta vez, cuando la aplicación realiza una solicitud a la dirección URL de supervisión, la respuesta es un redireccionamiento al resultado finalizado de la acción.
GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717
Una vez finalizada la acción, la respuesta del servicio de supervisión devolverá el valor resourceId de los resultados.
Recuperar los resultados de la operación completada
Una vez que haya finalizado el trabajo, la dirección URL de supervisión devuelve el resourceId del resultado, en este caso la nueva copia del elemento original.
Puede dirigir este nuevo elemento mediante resourceId, por ejemplo:
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
var graphClient = new GraphServiceClient(requestAdapter);
var result = await graphClient.Drives["{drive-id}"].Items["{driveItem-id}"].GetAsync();
<?php
// THIS SNIPPET IS A PREVIEW FOR THE KIOTA BASED SDK. NON-PRODUCTION USE ONLY
$graphServiceClient = new GraphServiceClient($requestAdapter);
$result = $graphServiceClient->drives()->byDriveId('drive-id')->items()->byItemId('driveItem-id')->get();
// THE PYTHON SDK IS IN PREVIEW. NON-PRODUCTION USE ONLY
client = GraphServiceClient(request_adapter)
result = await client.drives.by_drive_id('drive-id').items.by_item_id('driveItem-id').get()