Obter as alterações incrementais para grupos

A consulta delta no Microsoft Graph permite consultar adições, exclusões ou atualizações para recursos com suporte, por meio de uma série de solicitações delta . Para grupos, a consulta delta permite que você descubra alterações sem buscar todo o conjunto de grupos para comparar as alterações.

Os clientes que sincronizam grupos com um repositório de perfil local podem usar a consulta delta para a sincronização completa inicial, juntamente com as sincronizações incrementais subsequentes. Normalmente, um cliente faz uma sincronização total inicial de todos os grupos em um locatário e, em seguida, obtém alterações incrementais em grupos periodicamente.

Controlar alterações em grupos

Acompanhe as alterações de usuários por meio de uma ou mais solicitações GET com função delta. A solicitação GET tem as seguintes características:

  • A função delta pré-endended para o caminho da URL.
  • Um token de estado (deltatoken ou skiptoken) da chamada de função delta get anterior.
  • [Opcional] Todos os parâmetros de consulta com suporte

Exemplo

Este artigo mostra uma série de solicitações de exemplo para acompanhar as alterações em grupos:

  1. Uma solicitação inicial e réplica
  2. Uma solicitação do nextLink e réplica
  3. Uma final da solicitação nextLink e réplica
  4. Uma solicitação de deltaLink e réplica de deltaLink

Solicitação inicial

Para acompanhar as alterações no recurso de grupo, faça uma solicitação e inclua a função delta como um segmento de URL.

Dica

/delta é um atalho para o nome /microsoft.graph.deltatotalmente qualificado . As solicitações geradas pelos SDKs do Microsoft Graph usam o nome totalmente qualificado.

Anote os seguintes itens:

  • O parâmetro de consulta $select opcional está incluído na solicitação para demonstrar como os parâmetros de consulta são automaticamente incluídos nas futuras solicitações. Se necessário, os parâmetros de consulta devem ser especificados na solicitação inicial.
    • Somente as propriedades incluídas no $select são rastreadas para alterações. Se $select não for especificado, todas as propriedades do objeto serão rastreadas para alterações.
  • O parâmetro de consulta $select opcional também é usado para mostrar como os membros do grupo podem ser recuperados em conjunto com objetos de grupo. Essa funcionalidade permite o acompanhamento de alterações de associação, como quando os usuários são adicionados ou removidos de grupos.
  • A solicitação inicial não inclui um token de estado. Os tokens de estado são usados em solicitações subsequentes.
GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members

Resposta inicial

Se bem-sucedido, este método retorna o código de resposta 200 OK e uma coleção de objetos group no corpo da resposta. Se todo o conjunto de grupos for muito grande para se encaixar em uma resposta, um @odata.nextLink que contém um token de estado será incluído.

Neste exemplo, uma URL @odata.nextLink é retornada indicando que não há mais páginas de dados a serem recuperados na sessão. Observe o $skiptoken na URL. O parâmetro de consulta $select da solicitação inicial é codificado na URL @odata.nextLink.

A members@delta propriedade está incluída no grupo All Company e contém os dois membros atuais do grupo. O sg-HR não contém essa propriedade porque o grupo não tem membros.

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

A segunda solicitação usa o @odata.nextLink da resposta anterior, que contém o skiptoken. Observe que o parâmetro $select não está visivelmente presente, pois está codificado e incluído no token.

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

A resposta contém outro @odata.nextLink com um novo valor skiptoken, o que indica que mais alterações controladas para grupos estão disponíveis. Use a @odata.nextLink URL em solicitações subsequentes até que uma @odata.deltaLink URL (em um @odata.deltaLink parâmetro) seja retornada na resposta final, mesmo que o valor seja uma matriz vazia.

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

A terceira solicitação usa a última @odata.nextLink retornada da última solicitação de sincronização.

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

Quando uma URL @odata.deltaLink é retornada, não há mais dados sobre o estado existente dos objetos de grupo. Para solicitações futuras, o aplicativo usa @odata.deltaLink URL para saber mais sobre outras alterações nos grupos. Salve o deltatoken e use-o na URL de solicitação subsequente para descobrir mais alterações nos 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"
    }
  ]
}

Usando a @odata.deltaLink da última resposta, você obtém alterações (adições, exclusões ou atualizações) em grupos desde a última solicitação. As alterações incluem:

  • Objetos de grupo recém-criados.
  • Objetos de grupo excluídos.
  • Objetos de grupo para os quais uma propriedade rastreada foi alterada (por exemplo, um displayName atualizado).
  • Agrupar objetos para os quais os objetos membro foram adicionados ou removidos.
GET https://graph.microsoft.com/v1.0/groups/delta?$deltatoken=sZwAFZibx-LQOdZIo1hHhmmDhHzCY0Hs6snoIHJCSIfCHdqKdWNZ2VX3kErpyna9GygROwBk-rqWWMFxJC3pw

Se não houver alterações, um @odata.deltaLink será retornado sem resultados – a propriedade value é uma matriz vazia. Substitua o link anterior no aplicativo pelo novo para usar em chamadas futuras.

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

Se houver alterações, uma coleção de grupos alterados será incluída. A resposta também contém um @odata.nextLink, caso haja várias páginas de alterações a serem recuperadas, ou um @odata.deltaLink. Implemente o mesmo padrão de seguir o @odata.nextLink e persistir o @odata.deltaLink final para chamadas futuras.

Observação

Essa solicitação pode ter atrasos de replicação para grupos que foram criados, atualizados ou excluídos recentemente. Repita @odata.nextLink ou @odata.deltaLink depois de algum tempo para recuperar as alterações mais recentes.

Algumas coisas a observar sobre a resposta de exemplo:

  • Os objetos são retornados com o mesmo conjunto de propriedades originalmente especificado pelo parâmetro de consulta $select.
  • As propriedades alteradas e inalteradas estão incluídas – a propriedade de descrição tem um novo valor, enquanto a propriedade displayName não foi alterada.
  • members@delta contém as seguintes alterações na associação de grupo.
    • O usuário com ID 632f6bb2-3ec8-4c1f-9073-0027a8c6859 foi removido do grupo removendo sua associação, conforme descrito pela @removed propriedade. Objetos removidos de um grupo por meio da exclusão do objeto não são detectados por consultas delta.
    • O segundo usuário com ID 37de1ae3-408f-4702-8636-20824abda004 foi adicionado ao grupo.

Um objeto de grupo pode conter a @removed anotação nos seguintes cenários:

  • Quando um grupo é excluído (Microsoft 365 grupos), o item contém uma anotação: @removed com valor de "reason": "changed".
  • Quando o grupo é excluído permanentemente (um grupo de segurança ou excluindo permanentemente um grupo do Microsoft 365), o item contém uma anotação: @removed com valor de "reason": "deleted".
  • Quando o grupo é criado ou restaurado, não há anotação.
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"
                  }
              ]
          }
      ]
}

Ver membros de um grande grupo

A members@delta propriedade é incluída em objetos de grupo por padrão, quando o $select parâmetro de consulta não é especificado ou quando o $select=members parâmetro é especificado explicitamente. Para grupos com muitos membros, é possível que todos os membros não caibam em uma única resposta. Implemente o padrão a seguir para lidar com esses casos.

Observação

Esse padrão aplica-se à recuperação inicial do estado de grupo e às chamadas subsequentes para obter as alterações da consulta delta.

Vamos supor que você esteja executando a seguinte consulta delta– para capturar o estado completo inicial dos grupos ou posteriormente para obter alterações delta:

GET https://graph.microsoft.com/v1.0/groups/delta?$select=displayName,description,members
  1. O Microsoft Graph pode retornar uma resposta que contém apenas um objeto de grupo, com uma grande lista de membros na members@delta propriedade:

Primeira 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. Ao seguir o @odata.nextLink, você pode receber uma resposta que contém o mesmo objeto de grupo. Os mesmos valores de propriedade são retornados, mas a members@delta propriedade agora contém uma lista diferente de usuários.

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. Eventualmente, toda a lista de membros é retornada dessa forma e outros grupos começam a aparecer na resposta.

As seguintes práticas recomendadas devem ser seguidas para lidar corretamente com esse padrão:

  • Siga sempre o @odata.nextLink e mescle localmente o estado de cada grupo. Quando receber respostas relacionadas ao mesmo grupo, use-as para criar a lista completa de associação no aplicativo.
  • Não suponha uma sequência específica das respostas. Suponha que o mesmo grupo possa aparecer em qualquer lugar na sequência do @odata.nextLink e leve isso em conta na sua lógica de mesclagem.