Partilhar via


Obter as alterações incrementais para grupos

A consulta delta no Microsoft Graph permite-lhe consultar adições, eliminações ou atualizações a recursos suportados através de uma série de pedidos 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 completa inicial de todos os grupos num inquilino e, em seguida, recebe alterações incrementais a 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. O pedido GET tem as seguintes características:

  • A função delta foi anexada ao caminho do URL.
  • Um token de estado (deltatoken ou skiptoken) da chamada da função delta GET anterior.
  • [Opcional] Quaisquer parâmetros de consulta suportados

Exemplo

Este artigo mostra uma série de pedidos de exemplo para controlar as alterações aos 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.deltacompletamente qualificado . Os pedidos gerados pelos SDKs do Microsoft Graph utilizam o nome completamente 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 têm de ser especificados no pedido inicial.
    • Apenas as propriedades incluídas no $select são registadas para alterações. Se $select não for especificado, todas as propriedades do objeto são registadas 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. Esta capacidade permite controlar as alterações de associação, como quando os utilizadores são adicionados ou removidos dos grupos.
  • A solicitação inicial não inclui um token de estado. Os tokens de estado são utilizados em pedidos subsequentes.
  • Limitações dos parâmetros de consulta nas funções delta.
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 demasiado grande para caber numa resposta, é incluído um @odata.nextLink token que contém um estado.

Neste exemplo, uma URL @odata.nextLink é retornada indicando que não há mais páginas de dados a serem recuperados na sessão. Repare no $skiptoken NO 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 Toda a Empresa e contém os dois membros atuais do grupo. 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. Utilize o @odata.nextLink URL nos pedidos subsequentes até que um @odata.deltaLink URL (num @odata.deltaLink parâmetro) seja devolvido 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"
    }
  ]
}

Com a @odata.deltaLink da última resposta, obtém alterações (adições, eliminações ou atualizações) a grupos desde o último pedido. As alterações incluem:

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

Se não existirem alterações, é devolvido um @odata.deltaLink sem resultados – a propriedade do valor é 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 existirem alterações, é incluída uma coleção de grupos alterados. 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.

Alguns aspetos a ter em conta sobre a resposta de exemplo:

  • Os objetos são retornados com o mesmo conjunto de propriedades originalmente especificado pelo parâmetro de consulta $select.
  • Ambas as propriedades alteradas e inalteradas estão incluídas – a propriedade description 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 utilizador com o ID 632f6bb2-3ec8-4c1f-9073-0027a8c6859 foi removido do grupo ao remover a associação, conforme descrito pela @removed propriedade . Os objetos que são removidos de um grupo através da eliminação do objeto não são detetados por consultas delta.
    • O segundo utilizador com o 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 é eliminado permanentemente (um grupo de segurança ou elimina permanentemente um grupo do Microsoft 365), o item contém uma anotação: @removed com o 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 está incluída em objetos de grupo por predefinição, quando o $select parâmetro de consulta não é especificado ou quando o $select=members parâmetro é explicitamente especificado. 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 devolver 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, poderá receber uma resposta que contém o mesmo objeto de grupo. Os mesmos valores de propriedade são devolvidos, mas a members@delta propriedade contém agora uma lista diferente de utilizadores.

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 é devolvida desta 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.