Usar os SDKs do Microsoft Graph para solicitações em lotesUse the Microsoft Graph SDKs to batch requests

O lote é uma maneira de combinar várias solicitações em uma única solicitação HTTP.Batching is a way of combining multiple requests into a single HTTP request. As solicitações são combinadas em uma única carga JSON, que é enviada via POST para o \$batch ponto de extremidade.The requests are combined in a single JSON payload, which is sent via POST to the \$batch endpoint. Os SDKs do Microsoft Graph têm um conjunto de classes para simplificar como você cria cargas em lotes e analisar cargas de resposta em lotes.Microsoft Graph SDKs have a set of classes to simplify how you create batch payloads and parse batch response payloads.

Importante

Para limitações atuais com o lote JSON no Microsoft Graph, consulte Problemas Conhecidos.For current limitations with JSON batching in Microsoft Graph, see Known Issues.

Criar uma solicitação em loteCreate a batch request

Os SDKs do Microsoft Graph fornecem três classes para trabalhar com solicitações e respostas em lotes.The Microsoft Graph SDKs provide three classes to work with batch requests and responses.

  • BatchRequestStep - Representa uma única solicitação (como GET /me ) em um lote.BatchRequestStep - Represents a single request (such as GET /me) within a batch. Ele permite atribuir um identificador exclusivo à solicitação e especificar dependências entre solicitações.It enables assigning a unique identifier to the request and specifying dependencies between requests.
  • BatchRequestContent - Simplifica a criação da carga de solicitação em lote.BatchRequestContent - Simplifies creating the batch request payload. Ele contém vários objetos BatchRequestStep.It contains multiple BatchRequestStep objects.
  • BatchResponseContent - Simplifica a análise da resposta de uma solicitação em lotes.BatchResponseContent - Simplifies parsing the response from a batch request. Ele fornece a capacidade de obter todas as respostas, obter uma resposta específica por ID e obter a @odata.nextLink propriedade, se presente.It provides the ability to get all responses, get a specific response by ID, and get the @odata.nextLink property if present.

Exemplo de lotes simplesSimple batching example

Este exemplo mostra como enviar várias solicitações em um lote que não dependem umas das outras.This example shows how to send multiple requests in a batch that are not dependent on each other. As solicitações podem ser executados pelo serviço em qualquer ordem.The requests can be run by the service in any order. Este exemplo obtém o usuário e obtém a exibição de calendário do usuário para o dia atual.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}");
}

Lotes com solicitações dependentesBatches with dependent requests

Este exemplo mostra como enviar várias solicitações em um lote que dependem umas das outras.This example shows how to send multiple requests in a batch that are dependent on each other. As solicitações serão executados pelo serviço na ordem especificada pelas dependências.The requests will be run by the service in the order specified by the dependencies. Este exemplo adiciona um evento com uma hora de início durante o dia atual ao calendário do usuário e obtém a exibição de calendário do usuário para o dia atual.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. Para garantir que a revisão de calendário retornada inclua o novo evento criado, a solicitação para o exibição de calendário é configurada como dependente da solicitação para adicionar o novo evento.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. Isso garante que a solicitação de evento add seja executada primeiro.This ensures that the add event request will execute first.

Observação

Se a solicitação de evento adicionar falhar, a solicitação obter exibição de calendário falhará com um 424 Failed Dependency erro.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}");
}