Microsoft Graph SDK は、バッチあたり 20 件の要求の制限に関して、バッチ処理要求を自動的に処理します。 つまり、コードがこの制限を超えた場合、SDK はバックグラウンドで要求を個別のバッチに分割します。 これにより、各バッチが制限に準拠します。 このバッチ処理制限を処理するためのロジックを手動で実装する必要がなくなりました。これにより、コードがよりクリーンになり、管理が容易になります。
この例では、相互に依存しない複数の要求をバッチで送信する方法を示します。 サービスは、任意の順序で要求を実行できます。 この例では、ユーザーを取得し、現在の日のユーザーの予定表ビューを取得します。
var userRequest = graphClient.Me.ToGetRequestInformation();
var today = DateTime.Now.Date;
var eventsRequest = graphClient.Me.CalendarView
.ToGetRequestInformation(requestConfiguration =>
{
requestConfiguration.QueryParameters.StartDateTime =
today.ToString("yyyy-MM-ddTHH:mm:ssK");
requestConfiguration.QueryParameters.EndDateTime =
today.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssK");
});
var batchRequestContent = new BatchRequestContentCollection(graphClient);
var userRequestId = await batchRequestContent
.AddBatchRequestStepAsync(userRequest);
var eventsRequestId = await batchRequestContent
.AddBatchRequestStepAsync(eventsRequest);
var returnedResponse = await graphClient.Batch.PostAsync(batchRequestContent);
try
{
var user = await returnedResponse
.GetResponseByIdAsync<User>(userRequestId);
Console.WriteLine($"Hello {user.DisplayName}!");
}
catch (Exception ex)
{
Console.WriteLine($"Get user failed: {ex.Message}");
}
try
{
var events = await returnedResponse
.GetResponseByIdAsync<EventCollectionResponse>(eventsRequestId);
Console.WriteLine(
$"You have {events.Value?.Count} events on your calendar today.");
}
catch (Exception ex)
{
Console.WriteLine($"Get calendar view failed: {ex.Message}");
}
meRequest, err := graphClient.Me().
ToGetRequestInformation(context.Background(), nil)
if err != nil {
log.Fatalf("Error creating GET /me request: %v\n", err)
}
now := time.Now()
nowMidnight := time.Date(now.Year(), now.Month(), now.Day(),
0, 0, 0, 0, time.Local)
viewStart := nowMidnight.UTC().Format(time.RFC3339)
viewEnd := nowMidnight.AddDate(0, 0, 1).UTC().Format(time.RFC3339)
query := users.ItemCalendarViewRequestBuilderGetQueryParameters{
StartDateTime: &viewStart,
EndDateTime: &viewEnd,
Select: []string{"subject", "id"},
}
eventsRequest, err := graphClient.Me().
CalendarView().
ToGetRequestInformation(context.Background(),
&users.ItemCalendarViewRequestBuilderGetRequestConfiguration{
QueryParameters: &query,
})
if err != nil {
log.Fatalf("Error creating GET /me/calendarView request: %v\n", err)
}
batch := graphcore.NewBatchRequest(graphClient.GetAdapter())
meRequestItem, err := batch.AddBatchRequestStep(*meRequest)
if err != nil {
log.Fatalf("Error adding GET /me request to batch: %v\n", err)
}
eventsRequestItem, err := batch.AddBatchRequestStep(*eventsRequest)
if err != nil {
log.Fatalf("Error adding GET /me/calendarView request to batch: %v\n", err)
}
batchResponse, err := batch.Send(context.Background(), graphClient.GetAdapter())
if err != nil {
log.Fatalf("Error sending batch: %v\n", err)
}
user, err := graphcore.GetBatchResponseById[models.Userable](
batchResponse, *meRequestItem.GetId(), models.CreateUserFromDiscriminatorValue)
if err != nil {
log.Fatalf("Error reading GET /me response: %v\n", err)
}
fmt.Printf("Hello %s\n", *(user.GetDisplayName()))
events, err := graphcore.GetBatchResponseById[models.EventCollectionResponseable](
batchResponse, *eventsRequestItem.GetId(),
models.CreateEventCollectionResponseFromDiscriminatorValue)
if err != nil {
log.Fatalf("Error reading GET /me/calendarView response: %v\n", err)
}
fmt.Printf("You have %d events on your calendar today\n", len(events.GetValue()))
final BatchRequestContent batchRequestContent = new BatchRequestContent(
graphClient);
final RequestInformation meRequestInformation = graphClient.me()
.toGetRequestInformation();
final ZoneOffset localTimeZone = OffsetDateTime.now().getOffset();
final OffsetDateTime today = OffsetDateTime.of(LocalDate.now(),
LocalTime.MIDNIGHT, localTimeZone);
final OffsetDateTime tomorrow = today.plusDays(1);
RequestInformation calenderViewRequestInformation = graphClient.me()
.calendarView().toGetRequestInformation(requestConfiguration -> {
requestConfiguration.queryParameters.startDateTime = today.toString();
requestConfiguration.queryParameters.endDateTime = tomorrow.toString();
});
final String meRequestId = batchRequestContent
.addBatchRequestStep(meRequestInformation);
final String calendarViewRequestStepId = batchRequestContent
.addBatchRequestStep(calenderViewRequestInformation);
final BatchResponseContent batchResponseContent = Objects.requireNonNull(
graphClient.getBatchRequestBuilder().post(batchRequestContent, null));
final User me = batchResponseContent.getResponseById(meRequestId,
User::createFromDiscriminatorValue);
System.out.println(String.format("Hello %s!", me.getDisplayName()));
final EventCollectionResponse eventsResponse = Objects.requireNonNull(
batchResponseContent.getResponseById(calendarViewRequestStepId,
EventCollectionResponse::createFromDiscriminatorValue));
System.out.println(String.format("You have %d events on your calendar today",
Objects.requireNonNull(eventsResponse.getValue()).size()));
$userRequest = $graphClient->me()->toGetRequestInformation();
$timeZone = new \DateTimeZone('America/New_York');
$today = new \DateTimeImmutable('today midnight', $timeZone);
$tomorrow = new \DateTimeImmutable('tomorrow midnight', $timeZone);
$query = new CalendarViewRequestBuilderGetQueryParameters(
startDateTime: $today->format(\DateTime::ATOM),
endDateTime: $tomorrow->format(\DateTime::ATOM));
$config = new CalendarViewRequestBuilderGetRequestConfiguration(queryParameters: $query);
$eventsRequest = $graphClient->me()->calendarView()->toGetRequestInformation($config);
$userRequestItem = new BatchRequestItem($userRequest);
$eventsRequestItem = new BatchRequestItem($eventsRequest);
$batchRequestContent = new BatchRequestContent([$userRequestItem, $eventsRequestItem]);
$batchRequestBuilder = new BatchRequestBuilder($graphClient->getRequestAdapter());
$batchResponse = $batchRequestBuilder->postAsync($batchRequestContent)->wait();
$user = $batchResponse->getResponseBody($userRequestItem->getId(), Models\User::class);
print('Hello '.$user->getDisplayName().'!'.PHP_EOL);
$events = $batchResponse->getResponseBody($eventsRequestItem->getId(), Models\EventCollectionResponse::class);
print('You have '.count($events->getValue()).' events on your calendar today'.PHP_EOL);
const userRequestStep: BatchRequestStep = {
id: '1',
request: new Request('https://graph.microsoft.com/me', {
method: 'GET',
}),
};
const start = startOfToday().toISOString();
const end = endOfToday().toISOString();
const calendarViewRequestStep: BatchRequestStep = {
id: '2',
request: new Request(
`https://graph.microsoft.com/me/calendarView?startDateTime=${start}&endDateTime=${end}`,
{
method: 'GET',
},
),
};
const batchRequestContent = new BatchRequestContent([
userRequestStep,
calendarViewRequestStep,
]);
const content = await batchRequestContent.getContent();
const batchResponse = await graphClient.api('/$batch').post(content);
const batchResponseContent = new BatchResponseContent(batchResponse);
const userResponse = batchResponseContent.getResponseById('1');
if (userResponse.ok) {
const user: User = (await userResponse.json()) as User;
console.log(`Hello ${user.displayName}!`);
} else {
console.log(`Get user failed with status ${userResponse.status}`);
}
const calendarResponse = batchResponseContent.getResponseById('2');
if (calendarResponse.ok) {
const rawResponse = (await calendarResponse.json()) as PageCollection;
const events: Event[] = rawResponse.value;
console.log(`You have ${events.length} events on your calendar today.`);
} else {
console.log(
`Get calendar view failed with status ${calendarResponse.status}`,
);
}
この例では、相互に依存する複数の要求をバッチで送信する方法を示します。 サービスは、依存関係によって指定された順序で要求を実行します。 次の使用例は、現在の日の開始時刻を持つイベントをユーザーの予定表に追加し、現在の日のユーザーの予定表ビューを取得します。 返された予定表レビューに作成された新しいイベントが含まれていることを確認するために、予定表ビューの要求は、新しいイベントを追加する要求に依存するように構成されます。 これにより、追加イベント要求が最初に実行されます。
var today = DateTime.Now.Date;
var newEvent = new Event
{
Subject = "File end-of-day report",
Start = new DateTimeTimeZone
{
DateTime = today.AddHours(17)
.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = TimeZoneInfo.Local.StandardName,
},
End = new DateTimeTimeZone
{
DateTime = today.AddHours(17).AddMinutes(30)
.ToString("yyyy-MM-ddTHH:mm:ss"),
TimeZone = TimeZoneInfo.Local.StandardName,
},
};
var addEventRequest = graphClient.Me.Events
.ToPostRequestInformation(newEvent);
var calendarViewRequest = graphClient.Me.CalendarView.ToGetRequestInformation(
requestConfiguration =>
{
requestConfiguration.QueryParameters.StartDateTime =
today.ToString("yyyy-MM-ddTHH:mm:ssK");
requestConfiguration.QueryParameters.EndDateTime =
today.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ssK");
});
var batchRequestContent = new BatchRequestContentCollection(graphClient);
var addEventRequestId = await batchRequestContent
.AddBatchRequestStepAsync(addEventRequest);
var eventsRequestId = Guid.NewGuid().ToString();
var eventsRequestMessage = await graphClient.RequestAdapter
.ConvertToNativeRequestAsync<HttpRequestMessage>(calendarViewRequest);
batchRequestContent.AddBatchRequestStep(new BatchRequestStep(
eventsRequestId,
eventsRequestMessage,
[addEventRequestId]));
var returnedResponse = await graphClient.Batch.PostAsync(batchRequestContent);
try
{
var createdEvent = await returnedResponse
.GetResponseByIdAsync<Event>(addEventRequestId);
Console.WriteLine($"New event created with ID: {createdEvent.Id}");
}
catch (Exception ex)
{
Console.WriteLine($"Add event failed: {ex.Message}");
}
try
{
var events = await returnedResponse
.GetResponseByIdAsync<EventCollectionResponse>(eventsRequestId);
Console.WriteLine(
$"You have {events.Value?.Count} events on your calendar today.");
}
catch (Exception ex)
{
Console.WriteLine($"Get calendar view failed: {ex.Message}");
}
now := time.Now()
nowMidnight := time.Date(now.Year(), now.Month(), now.Day(),
0, 0, 0, 0, time.Local)
timeZone, _ := tzlocal.RuntimeTZ()
startDateTime := nowMidnight.Add(time.Hour * 17)
endDateTime := startDateTime.Add(time.Minute * 30)
graphDateTimeFormat := "2006-01-02T15:04:05"
newEvent := models.NewEvent()
subject := "File end-of-day report"
newEvent.SetSubject(&subject)
start := models.NewDateTimeTimeZone()
startString := startDateTime.Format(graphDateTimeFormat)
start.SetDateTime(&startString)
start.SetTimeZone(&timeZone)
newEvent.SetStart(start)
end := models.NewDateTimeTimeZone()
endString := endDateTime.Format(graphDateTimeFormat)
end.SetDateTime(&endString)
end.SetTimeZone(&timeZone)
newEvent.SetEnd(end)
addEventRequest, err := graphClient.Me().
Events().
ToPostRequestInformation(context.Background(), newEvent, nil)
if err != nil {
log.Fatalf("Error creating POST /me/events request: %v\n", err)
}
viewStart := nowMidnight.UTC().Format(time.RFC3339)
viewEnd := nowMidnight.AddDate(0, 0, 1).UTC().Format(time.RFC3339)
query := users.ItemCalendarViewRequestBuilderGetQueryParameters{
StartDateTime: &viewStart,
EndDateTime: &viewEnd,
Select: []string{"subject", "id"},
}
eventsRequest, err := graphClient.Me().
CalendarView().
ToGetRequestInformation(context.Background(),
&users.ItemCalendarViewRequestBuilderGetRequestConfiguration{
QueryParameters: &query,
})
if err != nil {
log.Fatalf("Error creating GET /me/calendarView request: %v\n", err)
}
batch := graphcore.NewBatchRequest(graphClient.GetAdapter())
addEventRequestItem, err := batch.AddBatchRequestStep(*addEventRequest)
if err != nil {
log.Fatalf("Error adding POST /me/events request to batch: %v\n", err)
}
eventsRequestItem, err := batch.AddBatchRequestStep(*eventsRequest)
if err != nil {
log.Fatalf("Error creating GET /me/calendarView request to batch: %v\n", err)
}
eventsRequestItem.DependsOnItem(addEventRequestItem)
batchResponse, err := batch.Send(context.Background(), graphClient.GetAdapter())
if err != nil {
log.Fatalf("Error sending batch: %v\n", err)
}
event, err := graphcore.GetBatchResponseById[models.Eventable](
batchResponse, *addEventRequestItem.GetId(),
models.CreateEventFromDiscriminatorValue)
if err != nil {
log.Fatalf("Error reading POST /me/events response: %v\n", err)
}
fmt.Printf("New event created with ID: %s\n", *(event.GetId()))
events, err := graphcore.GetBatchResponseById[models.EventCollectionResponseable](
batchResponse, *eventsRequestItem.GetId(),
models.CreateEventCollectionResponseFromDiscriminatorValue)
if err != nil {
log.Fatalf("Error reading GET /me/calendarView response: %v\n", err)
}
fmt.Printf("You have %d events on your calendar today\n", len(events.GetValue()))
final BatchRequestContent batchRequestContent = new BatchRequestContent(
graphClient);
final ZoneOffset localTimeZone = OffsetDateTime.now().getOffset();
final OffsetDateTime today = OffsetDateTime.of(LocalDate.now(),
LocalTime.MIDNIGHT, localTimeZone);
final OffsetDateTime tomorrow = today.plusDays(1);
final Event newEvent = new Event();
newEvent.setSubject("File end-of-day report");
final DateTimeTimeZone start = new DateTimeTimeZone();
start.setDateTime(
today.plusHours(17).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
start.setTimeZone(ZoneOffset.systemDefault().getId());
newEvent.setStart(start);
final DateTimeTimeZone end = new DateTimeTimeZone();
end.setDateTime(today.plusHours(17).plusMinutes(30)
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
end.setTimeZone(ZoneOffset.systemDefault().getId());
newEvent.setEnd(end);
RequestInformation postEventRequestInformation = graphClient.me().events()
.toPostRequestInformation(newEvent);
String postEventRequestId = batchRequestContent
.addBatchRequestStep(postEventRequestInformation);
final RequestInformation calendarViewRequestInformation = graphClient.me()
.calendarView().toGetRequestInformation(requestConfiguration -> {
requestConfiguration.queryParameters.startDateTime = today.toString();
requestConfiguration.queryParameters.endDateTime = tomorrow.toString();
});
final String calendarViewRequestId = batchRequestContent
.addBatchRequestStep(calendarViewRequestInformation);
batchRequestContent.getBatchRequestSteps().get(calendarViewRequestId)
.addDependsOnId(postEventRequestId);
final BatchResponseContent batchResponseContent = Objects.requireNonNull(
graphClient.getBatchRequestBuilder().post(batchRequestContent, null));
final Event postedEvent = batchResponseContent.getResponseById(postEventRequestId,
Event::createFromDiscriminatorValue);
System.out.println(String.format("New event created with ID: %s",
Objects.requireNonNull(postedEvent.getId())));
final EventCollectionResponse eventsResponse = Objects
.requireNonNull(batchResponseContent.getResponseById(calendarViewRequestId,
EventCollectionResponse::createFromDiscriminatorValue));
System.out.println(String.format("You have %d events on your calendar today",
Objects.requireNonNull(eventsResponse.getValue().size())));
$startTime = new \DateTimeImmutable('today 5PM');
$endTime = $startTime->add(new \DateInterval('PT30M'));
$newEvent = new Models\Event();
$newEvent->setSubject('File end-of-day report');
$start = new Models\DateTimeTimeZone();
$start->setDateTime($startTime->format('Y-m-d\TH:i:s'));
$start->setTimeZone('Eastern Standard Time');
$newEvent->setStart($start);
$end = new Models\DateTimeTimeZone();
$end->setDateTime($endTime->format('Y-m-d\TH:i:s'));
$end->setTimeZone('Eastern Standard Time');
$newEvent->setEnd($end);
$addEventRequest = $graphClient->me()->events()->toPostRequestInformation($newEvent);
$timeZone = new \DateTimeZone('America/New_York');
$today = new \DateTimeImmutable('today midnight', $timeZone);
$tomorrow = new \DateTimeImmutable('tomorrow midnight', $timeZone);
$query = new CalendarViewRequestBuilderGetQueryParameters(
startDateTime: $today->format(\DateTime::ATOM),
endDateTime: $tomorrow->format(\DateTime::ATOM));
$config = new CalendarViewRequestBuilderGetRequestConfiguration(queryParameters: $query);
$eventsRequest = $graphClient->me()->calendarView()->toGetRequestInformation($config);
$addEventRequestItem = new BatchRequestItem($addEventRequest);
$eventsRequestItem = new BatchRequestItem($eventsRequest, dependsOn: [$addEventRequestItem]);
$batchRequestContent = new BatchRequestContent([$addEventRequestItem, $eventsRequestItem]);
$batchRequestBuilder = new BatchRequestBuilder($graphClient->getRequestAdapter());
$batchResponse = $batchRequestBuilder->postAsync($batchRequestContent)->wait();
$createdEvent = $batchResponse->getResponseBody($addEventRequestItem->getId(), Models\Event::class);
print('New event created with ID: '.$createdEvent->getId().PHP_EOL);
$events = $batchResponse->getResponseBody($eventsRequestItem->getId(), Models\EventCollectionResponse::class);
print('You have '.count($events->getValue()).' events on your calendar today'.PHP_EOL);
const eventStart = setHours(startOfToday(), 17);
const eventEnd = setMinutes(eventStart, 30);
const newEvent: Event = {
subject: 'File end-of-day report',
start: {
dateTime: format(eventStart, `yyyy-MM-dd'T'HH:mm:ss`),
timeZone: 'Pacific Standard Time',
},
end: {
dateTime: format(eventEnd, `yyyy-MM-dd'T'HH:mm:ss`),
timeZone: 'Pacific Standard Time',
},
};
const addEventRequestStep: BatchRequestStep = {
id: '1',
request: new Request('https://graph.microsoft.com/me/events', {
method: 'POST',
body: JSON.stringify(newEvent),
headers: {
'Content-Type': 'application/json',
},
}),
};
const start = startOfToday().toISOString();
const end = endOfToday().toISOString();
const calendarViewRequestStep: BatchRequestStep = {
id: '2',
dependsOn: ['1'],
request: new Request(
`https://graph.microsoft.com/me/calendarView?startDateTime=${start}&endDateTime=${end}`,
{
method: 'GET',
},
),
};
const batchRequestContent = new BatchRequestContent([
addEventRequestStep,
calendarViewRequestStep,
]);
const content = await batchRequestContent.getContent();
const batchResponse = await graphClient.api('/$batch').post(content);
const batchResponseContent = new BatchResponseContent(batchResponse);
const newEventResponse = batchResponseContent.getResponseById('1');
if (newEventResponse.ok) {
const event: Event = (await newEventResponse.json()) as Event;
console.log(`New event created with ID: ${event.id}`);
} else {
console.log(`Create event failed with status ${newEventResponse.status}`);
}
const calendarResponse = batchResponseContent.getResponseById('2');
if (calendarResponse.ok) {
const rawResponse = (await calendarResponse.json()) as PageCollection;
const events: Event[] = rawResponse.value;
console.log(`You have ${events.length} events on your calendar today.`);
} else {
console.log(
`Get calendar view failed with status ${calendarResponse.status}`,
);
}