Utiliser les kits de développement logiciel (SDK) Microsoft Graph pour les requêtes par lotsUse the Microsoft Graph SDKs to batch requests

Le traitement par lots permet de combiner plusieurs demandes en une seule requête http.Batching is a way of combining multiple requests into a single HTTP request. Les requêtes sont combinées en une charge utile JSON unique, qui est envoyée via POST \$batch au point de terminaison.The requests are combined in a single JSON payload, which is sent via POST to the \$batch endpoint. Les kits de développement logiciel (SDK) Microsoft Graph ont un ensemble de classes pour simplifier la création de charges utiles par lots et l’analyse des charges utiles de réponse par lot.Microsoft Graph SDKs have a set of classes to simplify how you create batch payloads and parse batch response payloads.

Important

Pour connaître les limites actuelles du traitement par lots JSON dans Microsoft Graph, voir problèmes connus.For current limitations with JSON batching in Microsoft Graph, see Known Issues.

Créer une demande par lotsCreate a batch request

Les kits de développement logiciel (SDK) de Microsoft Graph fournissent trois classes pour travailler avec les demandes et les réponses par lots.The Microsoft Graph SDKs provide three classes to work with batch requests and responses.

  • BatchRequestStep -représente une seule requête (par exemple GET /me,) dans un lot.BatchRequestStep - Represents a single request (such as GET /me) within a batch. Il permet d’affecter un identificateur unique à la demande et de spécifier des dépendances entre les demandes.It enables assigning a unique identifier to the request and specifying dependencies between requests.
  • BatchRequestContent -simplifie la création de la charge utile de la demande par lots.BatchRequestContent - Simplifies creating the batch request payload. Il contient plusieurs objets BatchRequestStep .It contains multiple BatchRequestStep objects.
  • BatchResponseContent -simplifie l’analyse de la réponse à partir d’une demande par lots.BatchResponseContent - Simplifies parsing the response from a batch request. Elle permet d’obtenir toutes les réponses, d’obtenir une réponse spécifique par ID et d’obtenir la @odata.nextLink propriété, le cas échéant.It provides the ability to get all responses, get a specific response by ID, and get the @odata.nextLink property if present.

Exemple de traitement par lots simpleSimple batching example

Cet exemple montre comment envoyer plusieurs requêtes dans un lot qui ne sont pas dépendantes les unes des autres.This example shows how to send multiple requests in a batch that are not dependent on each other. Les demandes peuvent être exécutées par le service dans n’importe quel ordre.The requests can be run by the service in any order. Cet exemple obtient l’utilisateur et obtient l’affichage Calendrier de l’utilisateur pour le jour actuel.This example gets the user and gets the user's calendar view for the current day.

// Use the request builder to generate a regular
// request to /me
var userRequest = graphClient.Me.Request();

var today = DateTime.Now.Date;
var start = today.ToString("yyyy-MM-ddTHH:mm:ssK");
var end = today.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssK");

var queryOptions = new List<QueryOption>
{
    new QueryOption("startDateTime", start),
    new QueryOption("endDateTime", end)
};

// Use the request builder to generate a regular
// request to /me/calendarview?startDateTime="start"&endDateTime="end"
var eventsRequest = graphClient.Me.CalendarView.Request(queryOptions);

// Build the batch
var batchRequestContent = new BatchRequestContent();

// Using AddBatchRequestStep adds each request as a step
// with no specified order of execution
var userRequestId = batchRequestContent.AddBatchRequestStep(userRequest);
var eventsRequestId = batchRequestContent.AddBatchRequestStep(eventsRequest);

var returnedResponse = await graphClient.Batch.Request().PostAsync(batchRequestContent);

// De-serialize response based on known return type
try
{
    var user = await returnedResponse
        .GetResponseByIdAsync<User>(userRequestId);
    Console.WriteLine($"Hello {user.DisplayName}!");
}
catch (ServiceException ex)
{
    Console.WriteLine($"Get user failed: {ex.Error.Message}");
}

// For collections, must use the *CollectionResponse class to deserialize
// The .Value property will contain the *CollectionPage type that the Graph client
// returns from GetAsync().
try
{
    var events = await returnedResponse
        .GetResponseByIdAsync<UserCalendarViewCollectionResponse>(eventsRequestId);
    Console.WriteLine($"You have {events.Value.CurrentPage.Count} events on your calendar today.");
}
catch (ServiceException ex)
{
    Console.WriteLine($"Get calendar view failed: {ex.Error.Message}");
}

Lots avec demandes dépendantesBatches with dependent requests

Cet exemple montre comment envoyer plusieurs demandes dans un lot dépendant les uns des autres.This example shows how to send multiple requests in a batch that are dependent on each other. Les demandes seront exécutées par le service dans l’ordre spécifié par les dépendances.The requests will be run by the service in the order specified by the dependencies. Cet exemple montre comment ajouter un événement avec une heure de début au calendrier de l’utilisateur au cours de la journée actuelle et comment obtenir l’affichage Calendrier de l’utilisateur pour le jour en cours.This example adds an event with a start time during the current day to the user's calendar and gets the user's calendar view for the current day. Pour vous assurer que la révision du calendrier renvoyée inclut le nouvel événement créé, la demande pour l’affichage Calendrier est configurée comme étant dépendante de la demande d’ajout du nouvel événement.To make sure that the calendar review returned includes the new event created, the request for the calendar view is configured as dependent on the request to add the new event. Cela permet de s’assurer que la demande d’événement Add s’exécutera en premier.This ensures that the add event request will execute first.

Notes

Si la demande d’événement Add échoue, la requête get Calendar View échoue avec une 424 Failed Dependency erreur.If the add event request fails, the get calendar view request will fail with a 424 Failed Dependency error.

var today = DateTime.Now.Date;

var newEvent = new Event
{
    Subject = "File end-of-day report",
    Start = new DateTimeTimeZone
    {
        // 5:00 PM
        DateTime = today.AddHours(17).ToString("yyyy-MM-ddTHH:mm:ss"),
        TimeZone = TimeZoneInfo.Local.StandardName
    },
    End = new DateTimeTimeZone
    {
        // 5:30 PM
        DateTime = today.AddHours(17).AddMinutes(30).ToString("yyyy-MM-ddTHH:mm:ss"),
        TimeZone = TimeZoneInfo.Local.StandardName
    }
};

// POST requests are handled a bit differently
// The SDK request builders generate GET requests, so
// you must get the HttpRequestMessage and convert to a POST
var jsonEvent = graphClient.HttpProvider.Serializer.SerializeAsJsonContent(newEvent);

var addEventRequest = graphClient.Me.Events.Request().GetHttpRequestMessage();
addEventRequest.Method = HttpMethod.Post;
addEventRequest.Content = jsonEvent;

var start = today.ToString("yyyy-MM-ddTHH:mm:ssK");
var end = today.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssK");

var queryOptions = new List<QueryOption>
{
    new QueryOption("startDateTime", start),
    new QueryOption("endDateTime", end)
};

// Use the request builder to generate a regular
// request to /me/calendarview?startDateTime="start"&endDateTime="end"
var calendarViewRequest = graphClient.Me.CalendarView.Request(queryOptions);

// Build the batch
var batchRequestContent = new BatchRequestContent();

// Force the requests to execute in order, so that the request for
// today's events will include the new event created.

// First request, no dependency
var addEventRequestId = batchRequestContent.AddBatchRequestStep(addEventRequest);

// Second request, depends on addEventRequestId
var eventsRequestId = Guid.NewGuid().ToString();
batchRequestContent.AddBatchRequestStep(new BatchRequestStep(
    eventsRequestId,
    calendarViewRequest.GetHttpRequestMessage(),
    new List<string> { addEventRequestId }
));

var returnedResponse = await graphClient.Batch.Request().PostAsync(batchRequestContent);

// De-serialize response based on known return type
try
{
    var createdEvent = await returnedResponse
        .GetResponseByIdAsync<Event>(addEventRequestId);
    Console.WriteLine($"New event created with ID: {createdEvent.Id}");
}
catch (ServiceException ex)
{
    Console.WriteLine($"Add event failed: {ex.Error.Message}");
}

// For collections, must use the *CollectionResponse class to deserialize
// The .Value property will contain the *CollectionPage type that the Graph client
// returns from GetAsync().
try
{
    var events = await returnedResponse
        .GetResponseByIdAsync<UserCalendarViewCollectionResponse>(eventsRequestId);
    Console.WriteLine($"You have {events.Value.CurrentPage.Count} events on your calendar today.");
}
catch (ServiceException ex)
{
    Console.WriteLine($"Get calendar view failed: {ex.Error.Message}");
}