Obtener los cambios incrementales en los eventos en una vista de calendario

Al utilizar la consulta delta, es posible obtener eventos nuevos, actualizados o eliminados en un calendario específico, o en una colección definida de eventos (como una vista Calendario) en el calendario. En este artículo se describe esto último: obtener tales cambios incrementales en los eventos en una vista Calendario.

Nota:

La funcionalidad de los primeros( obtener cambios incrementales en los eventos de un calendario que no están enlazados a un intervalo fijo de fechas de inicio y finalización) solo está disponible actualmente en la versión beta. Para obtener más información, vea función Delta.

Una vista de calendario es una colección de eventos en un intervalo de fecha y hora (.. /me/calendarView) del calendario predeterminado o de algún otro calendario especificado de un usuario o de un calendario de grupo. Los eventos devueltos pueden incluir instancias únicas, o apariciones y excepciones de una serie periódica. Los datos de delta permiten mantener y sincronizar un almacén local de eventos de un usuario, sin tener que capturar cada vez todo el conjunto de eventos del usuario desde el servidor.

La consulta de delta admite la sincronización completa que recupera todos los eventos en la vista de calendario especificada y la sincronización incremental que recupera aquellos eventos que cambiaron en la vista de calendario desde la última sincronización. Normalmente, se debería realizar una sincronización completa inicial y, después, obtener los cambios incrementales en la vista Calendario de forma periódica.

Seguir los cambios de eventos en una vista de calendario

La consulta de delta para eventos es específica del calendario y el intervalo de fecha y hora que se especifique (por ejemplo, una vista de calendario). Para realizar el seguimiento de los cambios en varios calendarios, necesitará realizar el seguimiento de cada calendario individualmente.

El seguimiento de los cambios de eventos en una vista de calendario normalmente es una ronda de una o varias solicitudes GET con la función delta. La solicitud GET inicial es muy similar a la forma en que enumera una vista Calendario, excepto que se incluye la función delta. La siguiente es la solicitud GET delta inicial de una vista de calendario en el calendario predeterminado del usuario que ha iniciado sesión:

GET /me/calendarView/delta?startDateTime={start_datetime}&endDateTime={end_datetime}

Una solicitud GET con la función delta función devuelve:

  • Un @odata.nextLink (que contiene una dirección URL con una llamada de función delta y un $skipToken),
  • Un @odata.deltaLink (que contiene una dirección URL con una llamada de función delta y un $deltaToken).

Estos tokens son tokens de estado que codifican los parámetros refs/remotes/microsoftgraph/master startDateTime y endDateTime, y cualquier otro parámetro de consulta en la solicitud GET de la consulta de delta inicial. No es necesario que incluya estos parámetros en solicitudes posteriores, ya que se codifican en los tokens.

Los tokens de estado son totalmente opacos para el cliente. Para continuar con una ronda de seguimiento de cambios, basta con copiar y aplicar la dirección URL @odata.nextLink o @odata.deltaLink devuelta desde la última solicitud GET a la siguiente llamada de funcióndelta para la mismo vista de calendario. Un @odata.deltaLink devuelto en una respuesta significa que la ronda actual de seguimiento de cambios está completa. Se puede guardar y usar la dirección URL @odata.deltaLink cuando se inicia la siguiente ronda.

Vea el ejemplo para obtener información sobre cómo usar estas direcciones URL @odata.nextLink y @odata.deltaLink.

Usar parámetros de consulta en una consulta de delta para la vista de calendario

  • Incluya los parámetros startDateTime y endDateTime para definir un intervalo de fecha y hora para la vista de calendario.
  • $select no es compatible.

Encabezado de solicitud opcional

Cada solicitud GET de la consulta delta devuelve una colección de uno o más eventos en la respuesta. Opcionalmente se puede especificar el encabezado de solicitud, Prefer: odata.maxpagesize={x}, para establecer el número máximo de eventos en una respuesta.

Ejemplo: sincronizar los eventos en una vista Calendario

En el ejemplo siguiente se muestra una serie de tres solicitudes para sincronizar el calendario predeterminado del usuario en un intervalo de tiempo específico. En esa vista de calendario hay cinco eventos.

Para mayor brevedad, las respuestas de ejemplo muestran solo un subconjunto de las propiedades de un evento. En una llamada real, se devuelve la mayoría de las propiedades de evento .

Vea lo que hará la siguiente ronda.

Paso 1: solicitud inicial de ejemplo

En este ejemplo, se sincroniza por primera vez la vista de calendario especificada, por lo que la solicitud de sincronización inicial no incluye ningún token de estado. La ronda devolverá todos los eventos de esa vista de calendario.

La primera solicitud especifica lo siguiente:

  • Valores de fecha u hora para los parámetros startDateTime y endDateTime.
  • El encabezado de solicitud opcional, odata.maxpagesize, que devuelve dos eventos a la vez.
GET https://graph.microsoft.com/v1.0/me/calendarView/delta?startdatetime=2016-12-01T00:00:00Z&enddatetime=2016-12-30T00:00:00Z HTTP/1.1
Prefer: odata.maxpagesize=2

Respuesta inicial de ejemplo

La respuesta incluye dos eventos y un encabezado de respuesta @odata.nextLink con un skipToken. La dirección URL @odata.nextLink indica que hay más eventos para obtener en la vista de calendario.

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

{
    "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#Collection(event)",
    "@odata.nextLink":"https://graph.microsoft.com/v1.0/me/calendarView/delta?$skiptoken=R0usmcCM996atia_s",
    "value":[
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAAFXcvIQ==\"",
            "subject":"Plan shopping list",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-09T20:30:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-09T22:00:00.0000000",
                "timeZone":"UTC"
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADNVxRAAA="
        },
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAAFXcvIg==\"",
            "subject":"Pick up car",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-10T01:00:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-10T02:00:00.0000000",
                "timeZone":"UTC"
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADVxSAAA="
        }
    ]
}

Paso 2: segunda solicitud de ejemplo

La segunda solicitud especifica la dirección URL @odata.nextLink devuelta de la respuesta anterior. Observe que ya no tiene que especificar los mismos parámetros startDateTime y endDateTime como en la solicitud inicial, dado que el skipToken en la dirección URL @odata.nextLink los codifica y los incluye.

GET https://graph.microsoft.com/v1.0/me/calendarView/delta?$skiptoken=R0usmcCM996atia_s HTTP/1.1
Prefer: odata.maxpagesize=2

Segunda respuesta de ejemplo

La segunda respuesta devuelve los dos siguientes eventos próximos en la vista de calendario y otro @odata.nextLink, para indicar que hay más eventos para obtener desde la vista de calendario.

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

{
    "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#Collection(event)",
    "@odata.nextLink":"https://graph.microsoft.com/v1.0/me/calendarView/delta?$skiptoken=R0usmci39OQxqJrxK4",
    "value":[
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAAFXcvIw==\"",
            "subject":"Get food",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-10T19:30:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-10T21:30:00.0000000",
                "timeZone":"UTC"
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADVxTAAA="
        },
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAAFXcvJA==\"",
            "subject":"Prepare food",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-10T22:00:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-11T00:00:00.0000000",
                "timeZone":"UTC"
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADVxUAAA="
        }
    ]
}

Paso 3: tercera solicitud de ejemplo

La tercera solicitud continúa usando el último @odata.nextLink devuelto desde la última solicitud de sincronización.

GET https://graph.microsoft.com/v1.0/me/calendarView/delta?$skiptoken=R0usmci39OQxqJrxK4 HTTP/1.1
Prefer: odata.maxpagesize=2

Tercera y última respuesta de ejemplo

La tercera respuesta devuelve el único evento restante en la vista de calendario y una dirección URL @odata.deltaLink que indica que la sincronización se completó para esta vista de calendario. Guarde y use la dirección URL @odata.deltaLink para sincronizar la vista de calendario en la siguiente ronda.

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

{
    "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#Collection(event)",
    "@odata.deltaLink":"https://graph.microsoft.com/v1.0/me/calendarView/delta?$deltatoken=R0usmcMDNGg0J1E",
    "value":[
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAALZu97g==\"",
            "subject":"Rest!",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-12T02:00:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-12T07:30:00.0000000",
                "timeZone":"UTC"
            },
            "location":{
                "displayName":"Home"
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADj1HuAAA="
        }
    ]
}

La siguiente ronda: primera solicitud de ejemplo

Con el @odata.deltaLink de la última solicitud de la última ronda, solo se podrán obtener aquellos eventos que cambiaron (que se agregaron, eliminaron o actualizaron) en esa vista de calendario desde entonces. La primera solicitud de la ronda siguiente será similar a la mostrada a continuación, suponiendo que prefiere mantener el mismo tamaño de página máximo en la respuesta:

GET https://graph.microsoft.com/v1.0/me/calendarView/delta?$deltatoken=R0usmcMDNGg0J1E HTTP/1.1
Prefer: odata.maxpagesize=2

La siguiente ronda: primera respuesta de ejemplo

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

{
    "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#Collection(event)",
    "@odata.deltaLink":"https://graph.microsoft.com/v1.0/me/calendarView/delta?$deltatoken=R0usmcFuQtZdtpk4",
    "value":[
        {
            "@odata.type": "#microsoft.graph.event",
            "id": "AAMkADk0MGFkODE3LWE4MmYtNDRhOS04OGQLkRkXbBznTvAADb6ytyAAA=",
            "@removed": {
                "reason": "deleted"
            }
        },
        {
            "@odata.type":"#microsoft.graph.event",
            "@odata.etag":"W/\"EZ9r3czxY0m2jz8c45czkwAALZu97w==\"",
            "subject":"Attend service",
            "body":{
                "contentType":"html",
                "content":""
            },
            "start":{
                "dateTime":"2016-12-25T06:00:00.0000000",
                "timeZone":"UTC"
            },
            "end":{
                "dateTime":"2016-12-25T07:30:00.0000000",
                "timeZone":"UTC"
            },
            "location":{
                "displayName":"Chapel of Saint Ignatius",
                "address":{
                    "street":"900 Broadway",
                    "city":"Seattle",
                    "state":"WA",
                    "countryOrRegion":"United States",
                    "postalCode":""
                },
                "coordinates":{
                    "latitude":47.6105,
                    "longitude":-122.321
                }
            },
            "attendees":[

            ],
            "organizer":{
                "emailAddress":{
                    "name":"Samantha Booth",
                    "address":"samanthab@contoso.com"
                }
            },
            "id":"AAMkADj1HvAAA="
        }
    ]
}