Obtener los cambios incrementales de grupos

La consulta delta de Microsoft Graph le permite consultar adiciones, eliminaciones o actualizaciones en los recursos admitidos a través de una serie de solicitudes delta . En el caso de los grupos, la consulta delta permite detectar cambios sin capturar todo el conjunto de grupos para comparar los cambios.

Los clientes que sincronizan grupos con un almacén de perfiles local pueden usar la consulta delta para su sincronización completa inicial junto con las sincronizaciones incrementales posteriores. Normalmente, un cliente realiza una sincronización completa inicial de todos los grupos de un inquilino y, a continuación, obtiene los cambios incrementales en los grupos periódicamente.

Realizar un seguimiento de los cambios en los grupos

Realice un seguimiento de los cambios del usuario a través de una o más solicitudes GET con la función delta. La solicitud GET tiene las siguientes características:

  • Función delta antepuesto a la ruta de acceso de la dirección URL.
  • Un token de estado (deltatoken o skiptoken) de la llamada a la función delta GET anterior.
  • [Opcional] Cualquier parámetro de consulta admitido

Ejemplo:

En este artículo se muestra una serie de solicitudes de ejemplo para realizar un seguimiento de los cambios en los grupos:

  1. Una solicitud inicial y una respuesta inicial
  2. Una solicitud de nextLink y respuesta
  3. Una solicitud final de nextLinkyrespuesta
  4. Una solicitud deltaLink yuna respuesta deltaLink

Solicitud inicial

Para realizar un seguimiento de los cambios en el recurso de grupo, realice una solicitud e incluya la función delta como segmento de dirección URL.

Sugerencia

/delta es un acceso directo para el nombre /microsoft.graph.deltacompleto. Las solicitudes generadas por los SDK de Microsoft Graph usan el nombre completo.

Tenga en cuenta los siguientes elementos:

  • El parámetro de consulta $select opcional se incluye en la solicitud para demostrar cómo los parámetros de consulta se incluyen automáticamente en futuras solicitudes. Si es necesario, los parámetros de consulta deben especificarse en la solicitud inicial.
    • Solo se realiza el seguimiento de los cambios en las propiedades incluidas en $select . Si $select no se especifica, se realiza un seguimiento de todos los cambios en todas las propiedades del objeto.
  • El parámetro de consulta$select opcional también se utiliza para mostrar cómo se pueden recuperar los miembros del grupo junto con los objetos del grupo. Esta funcionalidad permite realizar un seguimiento de los cambios de pertenencia, como cuando los usuarios se agregan o quitan de los grupos.
  • La solicitud inicial no incluye un token de estado. Los tokens de estado se usan en solicitudes posteriores.
GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members

Respuesta inicial

Si se ejecuta correctamente, este método devuelve el código de respuesta 200 OK y el objeto de colección grupo en el cuerpo de la respuesta. Si todo el conjunto de grupos es demasiado grande para caber en una respuesta, se incluye un @odata.nextLink que contiene un token de estado.

En este ejemplo, se devuelve una dirección URL de @odata.nextLink que indica que hay más páginas de datos para recuperar en la sesión. Observe en $skiptoken la dirección URL. El $select parámetro de consulta de la solicitud inicial se codifica en la @odata.nextLink dirección URL.

La members@delta propiedad se incluye en el grupo Todas las compañías y contiene los dos miembros actuales del grupo. sg-HR no contiene esa propiedad porque el grupo no tiene ningún miembro.

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 segunda petición usa el @odata.nextLink de la respuesta anterior, que contiene el skiptoken. Observe que el parámetro $select no está visiblemente presente, ya que está codificado e incluido en el token.

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

La respuesta contiene otro @odata.nextLink con un nuevo valor skiptoken, que indica que hay disponibles más cambios de los que se realizaron seguimiento para los grupos. Use la @odata.nextLink dirección URL en solicitudes posteriores hasta que se devuelva una @odata.deltaLink dirección URL (en un @odata.deltaLink parámetro) en la respuesta final, incluso si el valor es una matriz vacía.

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 tercera solicitud usa la última devolución @odata.nextLink de la última solicitud de sincronización.

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

Cuando se devuelve una dirección URL @odata.deltaLink, no hay más datos sobre el estado existente de los objetos del grupo. Para las solicitudes futuras, la aplicación usa la dirección URL @odata.deltaLink para obtener información sobre los cambios en los grupos. Guarde deltatoken y utilícelo en la dirección URL de solicitud posterior para descubrir cambios en los grupos.

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"
    }
  ]
}

Con desde @odata.deltaLink la última respuesta, se obtienen cambios (adiciones, eliminaciones o actualizaciones) en los grupos desde la última solicitud. Los cambios incluyen:

  • Nuevos objetos de grupo creados.
  • Objetos de grupo eliminados.
  • Agrupar objetos para los que cambió una propiedad de seguimiento (por ejemplo, un displayName actualizado).
  • Objetos de grupo para los que se agregaron o quitaron objetos miembro.
GET https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw

Si no hay cambios, se devuelve un @odata.deltaLink sin resultados: la propiedad value es una matriz vacía. Asegúrese de que reemplaza el vínculo anterior en la aplicación con el nuevo para usar en futuras llamadas.

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": []
}

Si hay cambios, se incluye una colección de grupos modificados. La respuesta también contiene un @odata.nextLink, en caso de que haya varias páginas de cambios para recuperar, o un @odata.deltaLink. Implemente el mismo patrón de procedimientos siguiendo el @odata.nextLink y conserve el último @odata.deltaLink para futuras llamadas.

Nota:

Esta solicitud puede tener retrasos de replicación para los grupos que se crearon, actualizaron o eliminaron recientemente. Reintente el @odata.nextLink o @odata.deltaLink después de un tiempo para recuperar los cambios más recientes.

Algunas cosas a tener en cuenta sobre la respuesta de ejemplo:

  • Los objetos se devuelven con el mismo conjunto de propiedades especificadas originalmente a través de los $selectparámetros de consulta.
  • Se incluyen las propiedades modificadas y sin cambios: la propiedad description tiene un nuevo valor, mientras que la propiedad displayName no ha cambiado.
  • members@delta contiene los siguientes cambios en la pertenencia al grupo.
    • El usuario con identificador 632f6bb2-3ec8-4c1f-9073-0027a8c6859 se quitó del grupo quitando su pertenencia, tal como se describe en la @removed propiedad . Las consultas delta no detectan los objetos que se quitan de un grupo mediante la eliminación del objeto.
    • El segundo usuario con identificador 37de1ae3-408f-4702-8636-20824abda004 se agregó al grupo.

Un objeto de grupo puede contener la @removed anotación en los siguientes escenarios:

  • Cuando se elimina un grupo (grupos de Microsoft 365), el elemento contiene una anotación: @removed con el valor de "reason": "changed".
  • Cuando el grupo se elimina permanentemente (un grupo de seguridad o elimina permanentemente un grupo de Microsoft 365), el elemento contiene una anotación: @removed con el valor de "reason": "deleted".
  • Cuando se crea o restaura el grupo, no hay ninguna anotación.
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"
                  }
              ]
          }
      ]
}

Navegar por los miembros en un grupo grande

La members@delta propiedad se incluye en objetos de grupo de forma predeterminada, cuando no se especifica el $select parámetro de consulta o cuando el $select=members parámetro se especifica explícitamente. En el caso de los grupos con muchos miembros, es posible que todos los miembros no quepan en una sola respuesta. Implemente el siguiente patrón para controlar dichos casos.

Nota:

Este patrón se aplica tanto a la recuperación inicial del estado del grupo como a las llamadas posteriores para obtener cambios diferenciales.

Supongamos que ejecuta la siguiente consulta delta, ya sea para capturar el estado completo de los grupos inicial o más adelante para obtener cambios delta:

GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members
  1. Microsoft Graph podría devolver una respuesta que contenga solo un objeto de grupo, con una lista grande de miembros en la members@delta propiedad :

Primera Página

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. Al seguir , @odata.nextLinkes posible que reciba una respuesta que contenga el mismo objeto de grupo. Se devuelven los mismos valores de propiedad, pero la members@delta propiedad ahora contiene una lista diferente de usuarios.

Segunda página

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. Finalmente, la lista de miembros completa se devuelve de esta manera y otros grupos comienzan a aparecer en la respuesta.

Le recomendamos los siguientes procedimientos para administrar correctamente este patrón:

  • Siga siempre @odata.nextLink y combine de forma local cada estado de grupo: a medida que reciba respuestas relacionadas con el mismo grupo, puede usarlas para crear la lista de pertenencia completa en la aplicación.
  • No suponga una secuencia específica de las respuestas. Suponga que el mismo grupo podría mostrarse en cualquier lugar en la secuencia @odata.nextLink y téngalo en cuenta en la lógica de combinación.