Share via


Obtenir des modifications incrémentielles de groupes

La requête delta dans Microsoft Graph vous permet d’interroger les ajouts, les suppressions ou les mises à jour des ressources prises en charge, par le biais d’une série de demandes delta . Pour les groupes, la requête delta vous permet de découvrir les modifications sans extraire l’ensemble des groupes pour comparer les modifications.

Les clients qui synchronisent des groupes avec un magasin de profils local peuvent utiliser la requête delta pour leur synchronisation complète initiale, ainsi que pour les synchronisations incrémentielles suivantes. En règle générale, un client effectue une synchronisation complète initiale de tous les groupes d’un locataire, puis obtient régulièrement des modifications incrémentielles des groupes.

Suivre les modifications apportées aux groupes

Suivez les modifications de l’utilisateur via une ou plusieurs requêtes GET avec la fonction delta. La requête GET présente les caractéristiques suivantes :

  • Fonction delta ajoutée au chemin d’URL.
  • Jeton d’état (deltatoken ou skiptoken) de l’appel de fonction delta GET précédent.
  • [Facultatif] Tous les paramètres de requête pris en charge

Exemple

Cet article présente une série d’exemples de demandes pour suivre les modifications apportées aux groupes :

  1. Une Première requête et réponse
  2. Une Requête nextLink et réponse
  3. Une dernière requête nextLink et réponse
  4. Une demande deltaLink et réponse deltaLink

Première requête

Pour suivre les modifications apportées à la ressource de groupe, effectuez une requête et incluez la fonction delta en tant que segment d’URL.

Conseil

/delta est un raccourci pour le nom /microsoft.graph.deltacomplet . Les demandes générées par les sdk Microsoft Graph utilisent le nom complet.

Prenez note des éléments suivants :

  • Le paramètre de requête $select facultatif est inclus dans la requête pour montrer comment les paramètres de requête sont inclus automatiquement dans les futures requêtes. Si nécessaire, les paramètres de requête doivent être spécifiés dans la requête initiale.
    • Seules les propriétés incluses dans $select font l’objet d’un suivi des modifications. Si $select n’est pas spécifié, toutes les propriétés de l’objet font l’objet d’un suivi des modifications.
  • Le paramètre de requête $select facultatif permet également d’indiquer la manière dont les membres du groupe peuvent être récupérés avec les objets de groupe. Cette fonctionnalité permet le suivi des modifications d’appartenance, par exemple quand des utilisateurs sont ajoutés ou supprimés de groupes.
  • La demande initiale n’inclut pas de jeton d’état. Les jetons d’état sont utilisés dans les requêtes suivantes.
GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members

Première réponse

Si elle réussit, cette méthode renvoie un code de réponse 200 OK et un objet de collection group dans le corps de la réponse. Si l’ensemble des groupes est trop volumineux pour tenir dans une réponse, un @odata.nextLink contenant un jeton d’état est inclus.

Dans cet exemple, une URL @odata.nextLink est retournée, indiquant qu’il y a plus de pages de données à récupérer dans la session. Notez le $skiptoken dans l’URL. Le paramètre de requête $select de la requête initiale est encodé dans l’URL @odata.nextLink.

La members@delta propriété est incluse dans le groupe Toutes les sociétés et contient les deux membres actuels du groupe. sg-HR ne contient pas cette propriété, car le groupe n’a aucun membre.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups(displayName,description)",
  "@odata.nextLink":"https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=pqwSUjGYvb3jQpbwVAwEL7yuI3dU1LecfkkfLPtnIjvB7XnF_yllFsCrZJ",
  "value": [
    {
      "displayName":"All Company",
      "description":"This is the default group for everyone in the network",
      "id":"c2f798fd-f95d-4623-8824-63aec21fffff",
      "members@delta": [
               {
                   "@odata.type": "#microsoft.graph.user",
                   "id": "693acd06-2877-4339-8ade-b704261fe7a0"
               },
               {
                   "@odata.type": "#microsoft.graph.user",
                   "id": "49320844-be99-4164-8167-87ff5d047ace"
               }
      ]
    },
    {
      "displayName":"sg-HR",
      "description":"All HR personnel",
      "id":"ec22655c-8eb2-432a-b4ea-8b8a254bffff"
    }
  ]
}

La deuxième demande utilise l’élément @odata.nextLink de la réponse précédente, qui contient la valeur skiptoken. Notez que le paramètre $select n’est pas visiblement présent, car il est encodé et inclus dans le jeton.

GET https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=pqwSUjGYvb3jQpbwVAwEL7yuI3dU1LecfkkfLPtnIjvB7XnF_yllFsCrZJ

La réponse contient un autre @odata.nextLink avec une nouvelle valeur de skiptoken , ce qui indique que d’autres modifications suivies pour les groupes sont disponibles. Utilisez l’URL dans les @odata.nextLink requêtes suivantes jusqu’à ce qu’une @odata.deltaLink URL (dans un @odata.deltaLink paramètre) soit retournée dans la réponse finale, même si la valeur est un tableau vide.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.nextLink":"https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=pqwSUjGYvb3jQpbwVAwEL7yuI3dU1LecfkkfLPtnIjtQ5LOhVoS7qQG_wdVCHHlbQpga7",
  "value": [
    {
      "displayName":"Mark 8 Project Team",
      "description":"Mark 8 Project Team",
      "id":"2e5807ce-58f3-4a94-9b37-ffff2e085957",
      "members@delta": [
               {
                   "@odata.type": "#microsoft.graph.user",
                   "id": "632f6bb2-3ec8-4c1f-9073-0027a8c68593"
               }
      ]
    },
    {
      "displayName":"Sales and Marketing",
      "description":"Sales and Marketing",
      "id":"421e797f-9406-4934-b778-4908421e3505",
      "members@delta": [
               {
                   "@odata.type": "#microsoft.graph.user",
                   "id": "3c8ac7c4-d365-4df9-abfa-356a9dd7763c"
               },
               {
                   "@odata.type": "#microsoft.graph.user",
                   "id": "49320844-be99-4164-8167-87ff5d047ace"
               }
      ]
    }
  ]
}

La troisième requête utilise la dernière @odata.nextLink retournée par la dernière demande de synchronisation.

GET https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=ppqwSUjGYvb3jQpbwVAwEL7yuI3dU1LecfkkfLPtnIjtQ5LOhVoS7qQG_wdVCHHlbQpga7

Lorsqu’une URL @odata.deltaLink est retournée, il n’y a plus de données sur l’état existant des objets de groupe. Pour les demandes ultérieures, l’application utilise l’URL @odata.deltaLink pour en savoir plus sur les autres modifications apportées aux groupes. Enregistrez le deltatoken et utilisez-le dans l’URL de requête suivante pour découvrir d’autres modifications apportées aux groupes.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.deltaLink":"https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw",
  "value": [
    {
      "displayName":"All Employees",
      "id":"bed7f0d4-750e-4e7e-ffff-169002d06fc9"
    },
    {
      "displayName":"Remote living",
      "description":"Remote living",
      "id":"421e797f-9406-ffff-b778-4908421e3505"
    }
  ]
}

À l’aide de @odata.deltaLink la dernière réponse, vous obtenez les modifications (ajouts, suppressions ou mises à jour) apportées aux groupes depuis la dernière requête. Les modifications sont les suivantes :

  • Objets de groupe récemment créés.
  • Objets de groupe supprimés.
  • Regroupe les objets pour lesquels une propriété suivie a changé (par exemple, un displayName mis à jour).
  • Regrouper les objets pour lesquels des objets membres ont été ajoutés ou supprimés.
GET https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw

S’il n’y a aucune modification, un @odata.deltaLink est retourné sans résultats : la propriété value est un tableau vide. Veillez à remplacer le lien précédent dans l’application par le nouveau à utiliser dans les prochains appels.

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.deltaLink":"https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw",
  "value": []
}

En cas de modifications, une collection de groupes modifiés est incluse. La réponse contient également un élément @odata.nextLink (s’il existe plusieurs pages de modifications à récupérer) ou un élément @odata.deltaLink. Implémentez le même modèle de suivi du @odata.nextLink et conservez le @odata.deltaLink final pour les appels futurs.

Remarque

Cette demande peut avoir des retards de réplication pour les groupes qui ont été récemment créés, mis à jour ou supprimés. Réessayez le @odata.nextLink ou @odata.deltaLink après un certain temps pour récupérer les dernières modifications.

Voici quelques points à noter sur l’exemple de réponse :

  • Les objets sont renvoyés avec le même jeu de propriétés spécifié à l’origine via le paramètre de requête $select.
  • Les propriétés modifiées et inchangées sont incluses : la propriété description a une nouvelle valeur, tandis que la propriété displayName n’a pas changé.
  • members@delta contient les modifications suivantes apportées à l’appartenance au groupe.
    • L’utilisateur avec l’ID 632f6bb2-3ec8-4c1f-9073-0027a8c6859 a été supprimé du groupe en supprimant son appartenance, comme décrit par la @removed propriété . Les objets qui sont supprimés d’un groupe par suppression de l’objet ne sont pas détectés par les requêtes delta.
    • Le deuxième utilisateur avec l’ID 37de1ae3-408f-4702-8636-20824abda004 a été ajouté au groupe.

Un objet group peut contenir l’annotation @removed dans les scénarios suivants :

  • Lorsqu’un groupe est supprimé (groupes Microsoft 365), l’élément contient une annotation : @removed avec la valeur de "reason": "changed".
  • Lorsque le groupe est supprimé définitivement (groupe de sécurité ou suppression définitive d’un groupe Microsoft 365), l’élément contient une annotation : @removed avec la valeur ."reason": "deleted"
  • Lorsque le groupe est créé ou restauré, il n’y a pas d’annotation.
HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.deltaLink":"https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw",
  "value": [
          {
              "displayName": "TestGroup3",
              "description": "A test group for change tracking",
              "id": "2e5807ce-58f3-4a94-9b37-ffff2e085957",
              "members@delta": [
                  {
                      "@odata.type": "#microsoft.graph.user",
                      "id": "632f6bb2-3ec8-4c1f-9073-0027a8c6859",
                      "@removed": {
                          "reason": "deleted"
                      }
                  },
                  {
                      "@odata.type": "#microsoft.graph.user",
                      "id": "37de1ae3-408f-4702-8636-20824abda004"
                  }
              ]
          }
      ]
}

Parcourir les membres d’un grand groupe

La members@delta propriété est incluse dans les objets group par défaut, lorsque le $select paramètre de requête n’est pas spécifié ou lorsque le $select=members paramètre est explicitement spécifié. Pour les groupes comportant de nombreux membres, il est possible que tous les membres ne puissent pas tenir dans une réponse unique. Implémentez le modèle suivant pour gérer de tels cas.

Remarque

Ce modèle s’applique à la récupération initiale de l’état du groupe ainsi qu’aux appels suivants pour obtenir les modifications delta.

Supposons que vous exécutez la requête delta suivante , soit pour capturer l’état complet initial des groupes, soit ultérieurement pour obtenir les modifications delta :

GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members
  1. Microsoft Graph peut retourner une réponse qui contient un seul objet de groupe, avec une grande liste de membres dans la members@delta propriété :

Première page

HTTP/1.1 200 OK
Content-type: application/json

{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.nextLink":"https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=<...>",
  "value": [
    {
      "displayName":"LargeGroup",
      "description":"A group containing thousands of users",
      "id":"2e5807ce-58f3-4a94-9b37-ffff2e085957",
      "members@delta": [
          {
              "@odata.type": "#microsoft.graph.user",
              "id": "632f6bb2-3ec8-4c1f-9073-0027a8c6859",
              "@removed": {
                  "reason": "deleted"
              }
          },
          {
              "@odata.type": "#microsoft.graph.user",
              "id": "37de1ae3-408f-4702-8636-20824abda004"
          },
          <...more users here...>
      ]
    }
    <...no more groups included - this group filled out the entire response...>
  ]
}
  1. Lorsque vous suivez le @odata.nextLink, vous pouvez recevoir une réponse contenant le même objet de groupe. Les mêmes valeurs de propriété sont retournées, mais la members@delta propriété contient désormais une autre liste d’utilisateurs.

Deuxième page

HTTP/1.1 200 OK
Content-type: application/json
{
  "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#groups",
  "@odata.nextLink":"https://graph.microsoft.com/v1.0/groups/delta?$skiptoken=<...>",
  "value": [
    {
      "displayName":"LargeGroup",
      "description":"A group containing thousands of users",
      "id":"2e5807ce-58f3-4a94-9b37-ffff2e085957",
      "members@delta": [
          {
              "@odata.type": "#microsoft.graph.user",
              "id": "c08a463b-7b8a-40a4-aa31-f9bf690b9551",
              "@removed": {
                  "reason": "deleted"
              }
          },
          {
              "@odata.type": "#microsoft.graph.user",
              "id": "23423fa6-821e-44b2-aae4-d039d33884c2"
          },
          <...more users here...>
      ]
    }
    <...no more groups included - this group filled out the entire response...>
  ]
}
  1. Finalement, la liste complète des membres est retournée de cette façon, et d’autres groupes commencent à apparaître dans la réponse.

Nous vous recommandons les meilleures pratiques suivantes pour gérer correctement ce modèle :

  • Suivez toujours @odata.nextLink et fusionnez localement chaque état de groupe : lorsque vous recevez des réponses liées au même groupe, utilisez-les pour créer la liste complète d’appartenance dans votre application.
  • Ne supposez pas une séquence spécifique des réponses. Partez du principe que le même groupe peut apparaître n’importe où dans la séquence @odata.nextLink et traiter les éléments de votre logique de fusion.