Реагирование на изменения файлов и контейнеров с помощью веб-перехватчиков

Применимо к: Разработчик

Используйте веб-перехватчики Microsoft Graph, когда приложение должно реагировать на изменения файлов в контейнере SharePoint Embedded. Подписка сообщает Microsoft Graph, что нужно вызвать конечную точку HTTPS при изменении подписанного ресурса.

Схема потока веб-перехватчика SharePoint Embedded: приложение создает подписку Microsoft Graph для диска контейнера, а Microsoft Graph отправляет уведомления об изменениях в конечную точку HTTPS приложения.

Создание конечной точки уведомления

Предоставление конечной точки HTTPS, которая принимает запросы POST . Во время локальной разработки используйте ngrok для туннелирования запросов к локальному серверу.

ngrok http 3001

Выходные данные терминала ngrok, показывающие общедоступный URL-адрес переадресации HTTPS, который туннелирует на локальный сервер.

Когда Microsoft Graph создает подписку, она проверяет конечную точку, отправляя validationToken параметр запроса. Верните этот маркер в виде обычного текста с помощью HTTP 200.

export const onReceiptAdded = async (req: Request, res: Response) => {
  const validationToken = req.query['validationToken'];
  if (validationToken) {
    res.send(200, validationToken, { "Content-Type": "text/plain" });
    return;
  }

  const driveId = req.query['driveId'];
  if (!driveId) {
    res.send(200, "Notification received without driveId, ignoring", { "Content-Type": "text/plain" });
    return;
  }

  console.log(`Received driveId: ${driveId}`);
  res.send(200, "");
}

Зарегистрируйте маршрут на сервере API и включите текст запроса и синтаксический анализ запроса, прежде чем маршрут обработает уведомления.

server.use(restify.plugins.bodyParser(), restify.plugins.queryParser());
server.post('/api/onReceiptAdded', async (req, res, next) => {
  try {
    const response = await onReceiptAdded(req, res);
    res.send(200, response);
  } catch (error: any) {
    res.send(500, { message: `Error in API server: ${error.message}` });
  }
  next();
});

Подписка на диск контейнера

Создайте подписку с помощью Microsoft Graph. В этом шаблоне идентификатор контейнера SharePoint Embedded является идентификатором диска.

POST https://graph.microsoft.com/v1.0/subscriptions
Content-Type: application/json
{
  "changeType": "updated",
  "notificationUrl": "https://contoso.example/api/onReceiptAdded?driveId={container-id}",
  "resource": "drives/{container-id}/root",
  "expirationDateTime": "{future-expiration-date-time}",
  "clientState": ""
}

Подпишитесь на изменения в разделе drives/{container-id}/root и добавьте driveId={container-id} к URL-адресу уведомления, чтобы обработчик смог идентифицировать контейнер.

Вычисление срока действия

Максимальный срок существования подписок на элементы диска составляет 4230 минут. Используйте скрипт предварительного запроса или планировщик серверной части, чтобы задать срок действия перед созданием подписки.

var now = new Date();
var duration = 1000 * 60 * 4230;
var expiry = new Date(now.getTime() + duration);
pm.environment.set("ContainerSubscriptionExpiry", expiry.toISOString());

Сохраните идентификатор подписки, ресурс, идентификатор контейнера и срок действия. Продлевать каждую подписку до истечения срока ее действия.

Безопасная обработка уведомлений

Быстро возвращается из запроса веб-перехватчика. Работа в фоновом режиме очереди, получение текущего состояния файла или контейнера с помощью Microsoft Graph и идемпотентная обработка, так как уведомления могут дублироваться или задерживаться.

Используйте веб-перехватчики для таких действий, как обработка документов, обновление индекса, уведомления пользователей или триггеры рабочего процесса. Сохраняйте периодическое задание сверки для пропущенных уведомлений или подписок с истекшим сроком действия.

Проверка потока

Создайте подписку, отправьте или обновите файл в контейнере и подтвердите, что конечная точка регистрирует ожидаемый идентификатор диска. В случае сбоя проверки проверка общедоступный URL-адрес HTTPS, validationToken тип контента ответа и то, анализирует ли сервер параметры запроса перед выполнением маршрута.

Дальнейшие действия