Push-Benachrichtigungen

In diesem Dokument wird beschrieben, wie Sie Push-Benachrichtigungen verwenden, die Ihre Anwendung informieren, wenn sich eine Ressource ändert.

Übersicht

Die Google Calendar API bietet Push-Benachrichtigungen, mit denen Sie Änderungen an Ressourcen beobachten können. Sie können dieses Feature verwenden, um die Leistung Ihrer Anwendung zu verbessern. So können Sie zusätzliche Netzwerk- und Rechenkosten vermeiden, die mit Abfrageressourcen verbunden sind, um festzustellen, ob sie sich geändert haben. Wenn sich eine beobachtete Ressource ändert, benachrichtigt die Google Calendar API Ihre Anwendung.

Wenn Sie Push-Benachrichtigungen verwenden möchten, müssen Sie zwei Dinge tun:

  • Richten Sie die Empfänger-URL oder den „Webhook“-Callback-Empfänger ein.

    Dies ist ein HTTPS-Server, der die API-Benachrichtigungen verarbeitet, die ausgelöst werden, wenn sich eine Ressource ändert.

  • Richten Sie einen Benachrichtigungskanal für jeden Ressourcenendpunkt ein, den Sie ansehen möchten.

    Ein Kanal gibt Routinginformationen für Benachrichtigungen an. Im Rahmen der Kanaleinrichtung gibst du die URL an, unter der du Benachrichtigungen erhalten möchtest. Wenn sich die Ressource eines Kanals ändert, sendet die Google Calendar API eine Benachrichtigung als POST-Anfrage an diese URL.

Derzeit unterstützt die Google Calendar API Benachrichtigungen bei Änderungen an den Ressourcen Acl, CalendarList, Events und Settings.

Benachrichtigungskanäle erstellen

Zum Anfordern von Push-Benachrichtigungen musst du einen Benachrichtigungskanal für jede Ressource einrichten, die du ansehen möchtest. Nachdem Sie die Benachrichtigungskanäle eingerichtet haben, informiert die Google Calendar API Ihre Anwendung über Änderungen an den beobachteten Ressourcen.

Smartwatch-Anfragen

Mit jeder aufrufbaren Google Calendar API-Ressource ist eine watch-Methode bei einem URI im folgenden Format verknüpft:

https://www.googleapis.com/apiName/apiVersion/resourcePath/watch

Zum Einrichten eines Benachrichtigungskanals für Nachrichten zu Änderungen an einer bestimmten Ressource senden Sie eine POST-Anfrage an die Methode watch für die Ressource.

Jeder Benachrichtigungskanal ist sowohl mit einem bestimmten Nutzer als auch mit einer bestimmten Ressource (oder einer Gruppe von Ressourcen) verknüpft. Eine watch-Anfrage ist nur erfolgreich, wenn der aktuelle Nutzer der Inhaber dieser Ressource ist oder die Berechtigung zum Zugriff auf diese Ressource hat.

Beispiel

Achten Sie auf Änderungen an einer Sammlung von Terminen in einem bestimmten Kalender:

POST https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events/watch
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myCalendarChannelDest", // (Optional) Your channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
}

Erforderliche Properties

Für jede watch-Anfrage müssen Sie Folgendes angeben:

  • Ein id-Property-String, der diesen neuen Benachrichtigungskanal in deinem Projekt eindeutig identifiziert. Wir empfehlen die Verwendung einer universell eindeutigen Kennung (UUID) oder eines ähnlichen Strings. Maximale Länge: 64 Zeichen.

    Der von Ihnen festgelegte ID-Wert wird im HTTP-Header X-Goog-Channel-Id jeder Benachrichtigungsnachricht wiederholt, die Sie für diesen Kanal erhalten.

  • Ein type-Attributstring, der auf den Wert web_hook festgelegt ist.

  • Ein address-Property-String, der auf die URL festgelegt ist, die Benachrichtigungen für diesen Benachrichtigungskanal überwacht und darauf reagiert. Dies ist Ihre Webhook-Callback-URL. Sie muss HTTPS verwenden.

    Die Google Calendar API kann nur dann Benachrichtigungen an diese HTTPS-Adresse senden, wenn auf Ihrem Webserver ein gültiges SSL-Zertifikat installiert ist. Folgende Zertifikate sind nicht gültig:

    • selbst signierte Zertifikate.
    • von einer nicht vertrauenswürdigen Quelle signierte Zertifikate
    • gesperrte Zertifikate
    • Zertifikate mit einem Betreff, der nicht mit dem Zielhostnamen übereinstimmt.

Optionale Attribute

Sie können diese optionalen Felder auch mit Ihrer watch-Anfrage angeben:

  • Ein token-Attribut, das einen beliebigen Stringwert für die Verwendung als Kanaltoken angibt. Benachrichtigungskanal-Tokens können für unterschiedliche Zwecke verwendet werden. Mit dem Token lässt sich beispielsweise überprüfen, ob es sich bei jeder eingehenden Nachricht um einen Kanal handelt, den Ihre Anwendung erstellt hat. So wird sichergestellt, dass die Benachrichtigung nicht gefälscht wird. Außerdem können Sie die Nachricht je nach Zweck dieses Kanals an das richtige Ziel in Ihrer Anwendung weiterleiten. Maximale Länge: 256 Zeichen.

    Das Token ist im HTTP-Header X-Goog-Channel-Token in jeder Benachrichtigung enthalten, die Ihre Anwendung für diesen Kanal erhält.

    Wenn Sie Tokens für Benachrichtigungskanäle verwenden, empfehlen wir Folgendes:

    • Verwende ein erweiterbares Codierungsformat wie URL-Suchparameter. Beispiel: forwardTo=hr&createdBy=mobile

    • Verwenden Sie dabei keine sensiblen Daten wie OAuth-Tokens.

  • Ein expiration-Attributstring, der auf einen Unix-Zeitstempel (in ms) des Datums und der Uhrzeit festgelegt ist, zu dem die Google Calendar API das Senden von Nachrichten für diesen Benachrichtigungskanal beenden soll.

    Wenn ein Kanal eine Ablaufzeit hat, wird er als Wert für den HTTP-Header X-Goog-Channel-Expiration (dieses Mal im menschenlesbaren Format) in jede Benachrichtigung aufgenommen, die deine Anwendung für diesen Kanal erhält.

Weitere Informationen zur Anfrage findest du in der API-Referenz zur Methode watch für die Ressourcen Acl, CalendarList, Events und Settings.

Antwort auf Uhr

Wenn die watch-Anfrage erfolgreich einen Benachrichtigungskanal erstellt, wird der HTTP-Statuscode 200 OK zurückgegeben.

Der Nachrichtentext der Watch-Antwort enthält Informationen über den soeben erstellten Benachrichtigungskanal, wie im folgenden Beispiel gezeigt.

{
  "kind": "api#channel",
  "id": "01234567-89ab-cdef-0123456789ab"", // ID you specified for this channel.
  "resourceId": "o3hgv1538sdjfh", // ID of the watched resource.
  "resourceUri": "https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events", // Version-specific ID of the watched resource.
  "token": "target=myApp-myCalendarChannelDest", // Present only if one was provided.
  "expiration": 1426325213000, // Actual expiration time as Unix timestamp (in ms), if applicable.
}

Zusätzlich zu den Attributen, die Sie im Rahmen Ihrer Anfrage gesendet haben, enthalten die zurückgegebenen Informationen auch resourceId und resourceUri, um die Ressource zu identifizieren, die auf diesem Benachrichtigungskanal beobachtet wird.

Sie können die zurückgegebenen Informationen an andere Benachrichtigungskanalvorgänge übergeben, z. B. an das Beenden von Benachrichtigungen.

Weitere Informationen zur Antwort findest du in der API-Referenz zur Methode watch für die Ressourcen Acl, CalendarList, Events und Settings.

Nachricht synchronisieren

Nachdem Sie einen neuen Benachrichtigungskanal zum Ansehen einer Ressource erstellt haben, sendet die Google Calendar API eine sync-Nachricht, um anzugeben, dass Benachrichtigungen gestartet werden. Der HTTP-Headerwert X-Goog-Resource-State für diese Nachrichten ist sync. Aufgrund von Problemen mit dem Netzwerktiming kann es vorkommen, dass die Nachricht sync schon empfangen wird, bevor du die Antwort der Methode watch erhältst.

Sie können die sync-Benachrichtigung ignorieren, aber Sie können sie auch verwenden. Wenn du beispielsweise den Kanal nicht behalten möchtest, kannst du die Werte X-Goog-Channel-ID und X-Goog-Resource-ID in einem Aufruf verwenden, um keine Benachrichtigungen mehr zu erhalten. Sie können auch die Benachrichtigung sync verwenden, um eine Initialisierung zur Vorbereitung auf spätere Ereignisse durchzuführen.

Das Format der sync-Nachrichten, die die Google Calendar API an Ihre empfangende URL sendet, wird unten angezeigt.

POST https://mydomain.com/notifications // Your receiving URL.
X-Goog-Channel-ID: channel-ID-value
X-Goog-Channel-Token: channel-token-value
X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format; present only if channel expires.
X-Goog-Resource-ID: identifier-for-the-watched-resource
X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
X-Goog-Resource-State: sync
X-Goog-Message-Number: 1

Synchronisierungsnachrichten haben immer den X-Goog-Message-Number-HTTP-Header-Wert 1. Jede weitere Benachrichtigung für diesen Kanal hat eine Nachrichtennummer, die größer als die vorherige ist. Die Nachrichtennummern sind jedoch nicht sequenziell.

Benachrichtigungskanäle werden verlängert

Ein Benachrichtigungskanal kann eine Ablaufzeit haben, bei der ein Wert entweder durch Ihre Anfrage oder durch interne Beschränkungen oder Standardwerte der Google Calendar API bestimmt wird. Hierbei wird der restriktivere Wert verwendet. Die Ablaufzeit des Kanals, sofern vorhanden, wird als Unix-Zeitstempel (in ms) in die von der Methode watch zurückgegebenen Informationen aufgenommen. Außerdem sind Datum und Uhrzeit des Ablaufdatums in für Menschen lesbarer Form in jeder Benachrichtigung enthalten, die Ihre Anwendung für diesen Kanal im HTTP-Header X-Goog-Channel-Expiration erhält.

Derzeit gibt es keine Möglichkeit, die Benachrichtigungskanäle automatisch zu verlängern. Wenn ein Kanal kurz vor dem Ablauf ist, musst du einen neuen erstellen. Rufe dazu die Methode watch auf. Wie immer musst du für die Property id des neuen Kanals einen eindeutigen Wert verwenden. Beachten Sie, dass es wahrscheinlich einen Zeitraum gibt, in dem die beiden Benachrichtigungskanäle für dieselbe Ressource aktiv sind.

Benachrichtigungen erhalten

Wenn sich eine überwachte Ressource ändert, erhält die Anwendung eine Benachrichtigung, in der die Änderung beschrieben wird. Die Google Calendar API sendet diese Nachrichten als HTTPS-POST-Anfragen an die URL, die Sie als „Adresse“ für diesen Benachrichtigungskanal angegeben haben.

Informationen zum Format der Benachrichtigung

Alle Benachrichtigungen enthalten eine Reihe von HTTP-Headern mit X-Goog--Präfixen. Einige Benachrichtigungstypen können auch einen Nachrichtentext enthalten.

Header

Benachrichtigungen, die von der Google Calendar API an Ihre empfangende URL gesendet werden, enthalten die folgenden HTTP-Header:

Header Beschreibung
Immer vorhanden
X-Goog-Channel-ID UUID oder ein anderer eindeutiger String, den Sie angegeben haben, um diesen Benachrichtigungskanal zu identifizieren.
X-Goog-Message-Number Ganzzahl, die diese Nachricht für diesen Benachrichtigungskanal identifiziert. Der Wert für sync-Nachrichten ist immer 1. Die Nachrichtennummern erhöhen sich für jede weitere Nachricht auf dem Kanal, sind jedoch nicht sequenziell.
X-Goog-Resource-ID Ein intransparenter Wert, der die beobachtete Ressource identifiziert. Diese ID ist in allen API-Versionen stabil.
X-Goog-Resource-State Der neue Ressourcenstatus, der die Benachrichtigung ausgelöst hat. Mögliche Werte: sync, exists oder not_exists.
X-Goog-Resource-URI Eine API-versionsspezifische Kennung für die beobachtete Ressource.
Manchmal vorhanden
X-Goog-Channel-Expiration Datum und Uhrzeit des Ablaufs des Benachrichtigungskanals in für Menschen lesbarem Format. Nur vorhanden, wenn definiert.
X-Goog-Channel-Token Das von Ihrer Anwendung festgelegte Token für den Benachrichtigungskanal, mit dem Sie die Quelle der Benachrichtigung prüfen können. Ist nur vorhanden, wenn definiert.

Benachrichtigungen, die von der Google Calendar API an Ihre Empfänger-URL gesendet werden, enthalten keinen Nachrichtentext. Diese Nachrichten enthalten keine spezifischen Informationen zu aktualisierten Ressourcen. Sie müssen einen weiteren API-Aufruf ausführen, um die vollständigen Änderungsdetails zu sehen.

Beispiele

Benachrichtigung für geänderte Sammlung von Ereignissen ändern:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: 4ba78bf0-6a47-11e2-bcfd-0800200c9a66
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: https://www.googleapis.com/calendar/v3/calendars/my_calendar@gmail.com/events
X-Goog-Resource-State:  exists
X-Goog-Message-Number: 10

Auf Benachrichtigungen reagieren

Für einen erfolgreichen Erfolg können Sie einen der folgenden Statuscodes zurückgeben: 200, 201, 202, 204 oder 102.

Wenn Ihr Dienst die API-Clientbibliothek von Google verwendet und 500,502, 503 oder 504 zurückgibt, wiederholt die Google Calendar API den exponentiellen Backoff. Jeder andere Rückgabestatuscode gilt als Nachrichtenfehler.

Benachrichtigungsereignisse für die Google Calendar API

Dieser Abschnitt enthält Details zu den Benachrichtigungen, die Sie erhalten können, wenn Sie Push-Benachrichtigungen mit der Google Calendar API verwenden.

X-Goog-Resource-State Gilt für Geliefert bei
sync ACLs, Kalenderlisten, Termine, Einstellungen. Ein neuer Kanal wurde erstellt. Du erhältst dann entsprechende Benachrichtigungen.
exists ACLs, Kalenderlisten, Termine, Einstellungen. Eine Ressource wurde geändert. Zu den möglichen Änderungen gehören das Erstellen einer neuen Ressource oder das Ändern oder Löschen einer vorhandenen Ressource.

Benachrichtigungen werden beendet

Die Ablaufzeit gibt an, wann die Benachrichtigungen automatisch beendet werden. Du kannst die Benachrichtigungen für einen bestimmten Kanal beenden, bevor er abläuft. Rufe dazu die Methode stop unter folgendem URI auf:

https://www.googleapis.com/calendar/v3/channels/stop

Für diese Methode musst du mindestens die Properties id und resourceId des Kanals angeben, wie im Beispiel unten gezeigt. Hinweis: Auch wenn die Google Calendar API mehrere Ressourcentypen mit watch-Methoden hat, gibt es nur eine stop-Methode.

Nur Nutzer mit der entsprechenden Berechtigung können einen Kanal beenden. Wichtig ist insbesondere:

  • Wenn der Kanal von einem regulären Nutzerkonto erstellt wurde, kann er nur von demselben Nutzer über denselben Client (an den OAuth 2.0-Client-IDs aus den Authentifizierungstokens identifiziert) wie zuvor erstellt werden.
  • Wenn der Kanal von einem Dienstkonto erstellt wurde, können alle Nutzer vom selben Client den Kanal beenden.
POST https://www.googleapis.com/calendar/v3/channels/stop
  
Authorization: Bearer {auth_token_for_current_user}
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66",
  "resourceId": "ret08u3rv24htgh289g"
}