En este artículo se describe cómo trabajar con acciones de ejecución prolongada al usar las API de Microsoft Graph. Algunas respuestas de API requieren una cantidad indeterminada de tiempo para completarse. En lugar de esperar hasta que la acción se complete antes de devolver una respuesta, Microsoft Graph podría usar un patrón de acciones de ejecución prolongada. Este patrón proporciona a la aplicación una manera de sondear las actualizaciones de estado en una acción de ejecución prolongada, sin ninguna solicitud a la espera de que se complete la acción.
El patrón general implica los pasos siguientes:
La aplicación solicita una acción de ejecución prolongada a través de la API. La API acepta la acción y devuelve una 202 Accepted respuesta junto con un Location encabezado para que la dirección URL de la API recupere los informes de estado de la acción.
La aplicación solicita la dirección URL del informe de estado de acción y recibe una respuesta asyncJobStatus con el progreso de la acción de ejecución prolongada.
Se completa la acción de ejecución prolongada.
La aplicación vuelve a solicitar la dirección URL del informe de estado de acción y recibe una respuesta asyncJobStatus que muestra la finalización de la acción.
Requisitos previos
También se requieren los mismos permisos necesarios para realizar una acción de ejecución prolongada para consultar el estado de una acción de ejecución prolongada.
Solicitud de acción inicial
En el ejemplo siguiente se usa el método driveitem: copy .
En este escenario, la aplicación realiza una solicitud para copiar una carpeta que contiene una gran cantidad de datos.
Es probable que esta solicitud tardará varios segundos en completarse porque 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
// 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);
// Code snippets are only available for the latest major version. Current major version is $v0.*
// Dependencies
import (
"context"
msgraphsdk "github.com/microsoftgraph/msgraph-beta-sdk-go"
graphdrives "github.com/microsoftgraph/msgraph-beta-sdk-go/drives"
graphmodels "github.com/microsoftgraph/msgraph-beta-sdk-go/models"
//other-imports
)
requestBody := graphdrives.NewCopyPostRequestBody()
parentReference := graphmodels.NewItemReference()
path := "/drive/root:/Documents"
parentReference.SetPath(&path)
requestBody.SetParentReference(parentReference)
name := "Copy of LargeFolder1"
requestBody.SetName(&name)
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
copy, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Copy().Post(context.Background(), requestBody, nil)
// 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\Beta\GraphServiceClient;
use Microsoft\Graph\Beta\Generated\Drives\Item\Items\Item\Copy\CopyPostRequestBody;
use Microsoft\Graph\Beta\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();
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph_beta import GraphServiceClient
from msgraph_beta.generated.drives.item.items.item.copy.copy_post_request_body import CopyPostRequestBody
from msgraph_beta.generated.models.item_reference import ItemReference
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = CopyPostRequestBody(
parent_reference = ItemReference(
path = "/drive/root:/Documents",
),
name = "Copy of LargeFolder1",
)
result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').copy.post(request_body)
Nota: Es posible que la dirección URL de ubicación devuelta no esté en el punto de conexión de Microsoft Graph API.
En muchos casos, este paso es el final de la solicitud, ya que la acción de copia se completa sin ningún otro trabajo de la aplicación.
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 requiere autenticación, ya que la dirección URL es de corta duración y es ú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 ejecución prolongada 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, se completa la operación de copia.
Esta vez, cuando la aplicación realiza una solicitud a la dirección URL de supervisión, la respuesta es un redireccionamiento al resultado final de la acción.
GET https://api.onedrive.com/monitor/4A3407B5-88FC-4504-8B21-0AABD3412717
Cuando se completa la acción, la respuesta del servicio de supervisión devuelve el identificador de recurso para los resultados.
Recuperar los resultados de la operación completada
Cuando se completa el trabajo, la dirección URL del monitor devuelve el identificador de recurso del resultado. En este caso, es la nueva copia del elemento original.
En el ejemplo siguiente se muestra cómo abordar este nuevo elemento mediante el identificador de recurso.
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 major version. Current major version is $v0.*
// Dependencies
import (
"context"
msgraphsdk "github.com/microsoftgraph/msgraph-beta-sdk-go"
//other-imports
)
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=go
items, err := graphClient.Drives().ByDriveId("drive-id").Items().ByDriveItemId("driveItem-id").Get(context.Background(), nil)
// 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();
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph_beta import GraphServiceClient
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
result = await graph_client.drives.by_drive_id('drive-id').items.by_drive_item_id('driveItem-id').get()