Powiadomienia o zmianach zasobów

Z tego dokumentu dowiesz się, jak używać powiadomień push, które informują aplikację o zmianach zasobu.

Omówienie

Interfejs Google Drive API umożliwia otrzymywanie powiadomień push, które pozwalają monitorować zmiany w zasobach. Dzięki tej funkcji możesz poprawić wydajność aplikacji. Dzięki temu możesz wyeliminować dodatkowe koszty sieci i przetwarzania związane z zasobami ankietowania, aby określić, czy uległy zmianie. Za każdym razem, gdy obserwowany zasób ulegnie zmianie, interfejs API Dysku Google wysyła powiadomienie do Twojej aplikacji.

Aby korzystać z powiadomień push, musisz wykonać 2 czynności:

  • Skonfiguruj odbierający adres URL lub „webhook” odbiornika wywołania zwrotnego.

    To serwer HTTPS, który obsługuje wiadomości z powiadomieniami interfejsu API, które są wywoływane po zmianie zasobu.

  • Skonfiguruj (kanał powiadomień) dla każdego punktu końcowego zasobu, który chcesz obserwować.

    Kanał określa informacje o przekierowywaniu wiadomości z powiadomieniami. W ramach konfiguracji kanału musisz podać konkretny adres URL, pod którym chcesz otrzymywać powiadomienia. Gdy zasób kanału ulegnie zmianie, interfejs API Dysku Google wyśle wiadomość z powiadomieniem w postaci POSTdo tego adresu URL.

Obecnie interfejs API Dysku Google obsługuje powiadomienia o zmianach w metodach fileschanges.

Tworzenie kanałów powiadomień

Aby żądać powiadomień push, musisz skonfigurować kanał powiadomień dla każdego zasobu, który chcesz monitorować. Gdy skonfigurujesz kanały powiadomień, interfejs API Dysku Google będzie informować Twoją aplikację o zmianach w obserwowanych zasobach.

Wysyłanie próśb o oglądanie

Każda zasóbowa przeglądalna za pomocą interfejsu API Dysku Google ma powiązaną metodę watch o identyfikatorze URI w tym formacie:

https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch

Aby skonfigurować kanał powiadomień dla wiadomości o zmianach w konkretnym zasobie, wyślij żądanie POST do metody watch tego zasobu.

Każdy kanał powiadomień jest powiązany z konkretnym użytkownikiem i konkretnym zasobem (lub zestawem zasobów). Żądanie watch nie zostanie zrealizowane, chyba że bieżący użytkownik lub konto usługi ma własność tego zasobu lub ma do niego uprawnienia.

Przykłady

Ten przykładowy kod pokazuje, jak za pomocą zasobu channels zacząć sprawdzać zmiany w pojedynczym zasobie files za pomocą metody files.watch:

POST https://www.googleapis.com/drive/v3/files/fileId/watch
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
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-myFilesChannelDest", // (Optional) Your files channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration date and time.
}

Poniższy przykładowy kod pokazuje, jak użyć zasobu channels, aby rozpocząć obserwowanie wszystkich zdarzeń changes za pomocą metody changes.watch:

POST https://www.googleapis.com/drive/v3/changes/watch
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a77", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myChangesChannelDest", // (Optional) Your changes channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration date and time.
}

Właściwości wymagane

W każdym żądaniu watch musisz podać te pola:

  • Unikalny ciąg znaków właściwości id, który jednoznacznie identyfikuje ten nowy kanał powiadomień w Twoim projekcie. Zalecamy użycie uniwersalnego identyfikatora (UUID) lub podobnego unikalnego ciągu znaków. Maksymalna długość: 64 znaki.

    Ustawiony przez Ciebie identyfikator jest odzwierciedlany w nagłówku HTTP X-Goog-Channel-Id każdej wiadomości z powiadomieniem, którą otrzymasz na tym kanale.

  • Ciąg znaków właściwości type ustawiony na wartość web_hook.

  • ciąg znaków właściwości address ustawiony na adres URL, który nasłuchuje i odpowiada na powiadomienia dla tego kanału powiadomień. To jest URL wywołania zwrotnego webhooka, który musi używać protokołu HTTPS.

    Pamiętaj, że interfejs Google Drive API może wysyłać powiadomienia na ten adres HTTPS tylko wtedy, gdy na serwerze WWW jest zainstalowany prawidłowy certyfikat SSL. Nie prawidłowe certyfikaty to między innymi:

    • podpisane samodzielnie,
    • podpisane przez niezaufane źródło,
    • unieważnione.
    • certyfikaty, których podmiot nie jest zgodny z celem, nazwa hosta.

Właściwości opcjonalne

W prośbie watch możesz też podać te pola opcjonalne:

  • Właściwość token, która określa dowolną wartość ciągu znaków do użycia jako token kanału. Tokeny kanału powiadomień możesz stosować do różnych celów. Możesz na przykład użyć tokena, aby sprawdzić, czy każda przychodząca wiadomość jest przeznaczona do kanału utworzonego przez Twoją aplikację (aby mieć pewność, że powiadomienie nie jest sfałszowane) lub przekierować wiadomość do odpowiedniego miejsca w aplikacji na podstawie celu tego kanału. Maksymalna długość: 256 znaków.

    Token jest dołączany w nagłówku HTTP X-Goog-Channel-Token w każdej wiadomości z powiadomieniem, którą aplikacja otrzymuje na tym kanale.

    Jeśli używasz tokenów kanału powiadomień, zalecamy:

    • Użyj formatu kodowania umożliwiającego rozszerzanie, np. parametrów zapytania w adresie URL. Przykład: forwardTo=hr&createdBy=mobile

    • Nie podawaj danych wrażliwych, takich jak tokeny OAuth.

  • Ciąg znaków właściwości expiration ustawiony na sygnatura czasowa Unixa (w milisekundach) z datą i godziną, kiedy interfejs Drive API Google ma przestać wysyłać wiadomości dla tego kanału powiadomień.

    Jeśli kanał ma czas ważności, jest on uwzględniany jako wartość nagłówka HTTP X-Goog-Channel-Expiration (w czytelnym dla człowieka formacie) w każdej wiadomości z powiadomieniem, którą aplikacja otrzymuje z tego kanału.

Więcej informacji o żądaniu znajdziesz w metodach watch fileschanges w dokumentacji referencyjnej interfejsu API.

Odpowiedź na film

Jeśli żądanie watch tworzy kanał powiadomień, zwraca kod stanu HTTP 200 OK.

Treść odpowiedzi na obejrzenie filmu zawiera informacje o korzystaniu z konkretnego kanału powiadomień, jak pokazano w przykładzie poniżej.

{
  "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/drive/v3/files/o3hgv1538sdjfh", // Version-specific ID of the watched resource.
  "token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
  "expiration": 1426325213000, // Actual expiration date and time as UNIX timestamp (in milliseconds), if applicable.
}

Oprócz właściwości wysłanych w ramach żądania informacje zwracane zawierają też wartości resourceIdresourceUri, które wskazują zasób wyświetlany na tym kanale powiadomień.

Możesz przekazać zwrócone informacje do innych operacji na kanale powiadomień, na przykład gdy chcesz zatrzymać otrzymywanie powiadomień.

Więcej informacji o odpowiedzi znajdziesz w metodach watch fileschanges w przewodniku po interfejsie API.

Synchronizowanie wiadomości

Po utworzeniu kanału powiadomień, aby obserwować zasób, interfejs API Dysku Google wysyła komunikat sync, aby wskazać, że powiadomienia są włączone. Wartość nagłówka HTTP X-Goog-Resource-State w tych wiadomościach to sync. Ze względu na problemy z synchronizacją sieci może się zdarzyć, że wiadomość sync zostanie wysłana, zanim otrzymasz odpowiedź metody watch.

Możesz bezpiecznie zignorować powiadomienie sync, ale możesz też z niego skorzystać. Jeśli na przykład zdecydujesz, że nie chcesz już korzystać z kanału, możesz użyć wartości X-Goog-Channel-IDX-Goog-Resource-ID w wywołaniu, aby zatrzymać otrzymywanie powiadomień. Możesz też użyć powiadomienia sync, aby przeprowadzić wstępną konfigurację w celu przygotowania się do późniejszych zdarzeń.

Format wiadomości sync wysyłanych przez interfejs Google Drive API do adresu URL odbierającego podany przez Ciebie w usłudze jest pokazany poniżej.

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 the 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

Wiadomości synchronizacji mają zawsze wartość nagłówka HTTP X-Goog-Message-Number 1. Każde kolejne powiadomienie na tym kanale ma numer większy od poprzedniego, ale numery wiadomości nie będą uporządkowane.

Odnawianie kanałów powiadomień

Kanał powiadomień może mieć czas ważności określony przez Twoje żądanie lub przez wewnętrzne limity interfejsu API Dysku Google lub domyślne wartości (używana jest bardziej restrykcyjna wartość). Czas wygaśnięcia kanału (jeśli istnieje) jest podawany jako oznaczenie czasu uniksowego (w milisekundach) w informacjach zwracanych przez metodę watch. Dodatkowo data i godzina wygaśnięcia (w czytelnym dla człowieka formacie) są zawarte w każdej wiadomości z powiadomieniem, którą aplikacja otrzymuje dla tego kanału w nagłówku HTTP X-Goog-Channel-Expiration.

Obecnie nie ma automatycznego sposobu odnawiania kanału powiadomień. Gdy kanał zbliża się do końca, musisz go zastąpić nowym, wywołując metodę watch. Jak zawsze, w przypadku właściwości id nowego kanału musisz użyć unikalnej wartości. Pamiętaj, że prawdopodobnie będzie okres „nakładania się”, gdy 2 kanały powiadomień dla tego samego zasobu będą aktywne.

otrzymywanie powiadomień;

Za każdym razem, gdy obserwowany zasób ulegnie zmianie, Twoja aplikacja otrzyma powiadomienie z opisem tej zmiany. Interfejs Google Drive API wysyła te wiadomości jako żądania HTTPS POST do adresu URL podanego jako address właściwość dla tego kanału powiadomień.

Interpretowanie formatu powiadomienia

Wszystkie wiadomości z powiadomieniami zawierają zestaw nagłówków HTTP z prefiksami X-Goog-. Niektóre typy powiadomień mogą też zawierać treść wiadomości.

Nagłówki

Wiadomości z powiadomieniami publikowane przez interfejs API Dysku Google do Twojego adresu URL zawierają te nagłówki HTTP:

Nagłówek Opis
Zawsze widoczne
X-Goog-Channel-ID Identyfikator UUID lub inny unikalny ciąg znaków, który umożliwia identyfikację tego kanału powiadomień.
X-Goog-Message-Number Wartość całkowita identyfikująca to powiadomienie dla tego kanału powiadomień. W przypadku wiadomości sync wartość zawsze wynosi 1. Numery wiadomości zwiększają się w przypadku każdej kolejnej wiadomości na kanale, ale nie są sekwencyjne.
X-Goog-Resource-ID Nieczytelna wartość identyfikująca obserwowany zasób. Ten identyfikator jest stabilny we wszystkich wersjach interfejsu API.
X-Goog-Resource-State Nowy stan zasobu, który wywołał powiadomienie. Możliwe wartości: sync, add, remove, update, trash, untrash lub change .
X-Goog-Resource-URI Identyfikator zasobu monitorowanego, który jest specyficzny dla wersji interfejsu API.
Czasami
X-Goog-Changed dodatkowe informacje o zmianach; Możliwe wartości: content, parents, children lub permissions. Nie dotyczy wiadomości sync.
X-Goog-Channel-Expiration Data i godzina wygaśnięcia kanału powiadomień w formacie zrozumiałym dla człowieka. Występuje tylko wtedy, gdy jest zdefiniowany.
X-Goog-Channel-Token Token kanału powiadomień ustawiony przez Twoją aplikację, którego możesz użyć do zweryfikowania źródła powiadomienia. Występuje tylko wtedy, gdy jest zdefiniowany.

Wiadomości powiadomień fileschanges są puste.

Przykłady

Komunikat powiadomienia o zmianie zasobów files, który nie zawiera treści żądania:

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/drive/v3/files/ret08u3rv24htgh289g
X-Goog-Resource-State:  update
X-Goog-Changed: content,properties
X-Goog-Message-Number: 10

Zmień powiadomienie o zmianie zasobów changes, które zawiera treść żądania:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 118
X-Goog-Channel-ID: 8bd90be9-3a58-3122-ab43-9823188a5b43
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Tue, 19 Nov 2013 01:13:52 GMT
X-Goog-Resource-ID:  ret987df98743md8g
X-Goog-Resource-URI: https://www.googleapis.com/drive/v3/changes
X-Goog-Resource-State:  changed
X-Goog-Message-Number: 23

{
  "kind": "drive#changes"
}

Odpowiedz na powiadomienia

Aby wskazać powodzenie, możesz zwrócić dowolny z tych kodów stanu: 200, 201, 202, 204 lub 102.

Jeśli Twoja usługa korzysta z biblioteki klienta interfejsu API Google i zwraca wartości 500, 502, 503 lub 504, interfejs API Dysku Google próbuje ponownie wykonać operację z eksponencjalnie wydłużającymi się przerwami. Każdy inny kod stanu zwrotu jest uznawany za błąd wiadomości.

Zdarzenia powiadomień interfejsu Google Drive API

W tej sekcji znajdziesz szczegółowe informacje o powiadomieniach, które możesz otrzymywać, gdy korzystasz z powiadomień push w ramach interfejsu Google Drive API.

X-Goog-Resource-State Dotyczy Dostarczone, gdy
sync files, changes Kanał został utworzony. Zaczniesz otrzymywać powiadomienia.
add files Utworzono lub udostępniono zasób.
remove files Istniejący zasób został usunięty lub udostępnianie zostało wycofane.
update files Zaktualizowano co najmniej 1 właściwość (metadane) zasobu.
trash files Zasób został przeniesiony do kosza.
untrash files Zasób został usunięty z kosza.
change changes Dodano co najmniej 1 element w changelogu.

W przypadku zdarzeń update może zostać podany nagłówek HTTP X-Goog-Changed. Nagłówek zawiera listę rozdzieloną przecinkami, która opisuje typy wprowadzonych zmian.

Typ zmiany Znaczenie
content Zawartość zasobu została zaktualizowana.
properties Zaktualizowano co najmniej 1 właściwość zasobu.
parents Dodano lub usunięto co najmniej 1 rodzic zasobu.
children Dodano lub usunięto co najmniej 1 zasób podrzędny.
permissions Uprawnienia zasobu zostały zaktualizowane.

Przykład nagłówka X-Goog-Changed:

X-Goog-Resource-State: update
X-Goog-Changed: content, permissions

Zatrzymaj powiadomienia

Właściwość expiration określa, kiedy powiadomienia przestaną być wysyłane automatycznie. Możesz przestać otrzymywać powiadomienia z określonego kanału przed jego wygaśnięciem, wywołując metodę stop pod adresem URI:

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

Ta metoda wymaga podania co najmniej właściwości id i resourceId kanału, jak pokazano w przykładzie poniżej. Pamiętaj, że jeśli interfejs API Dysku Google obsługuje kilka typów zasobów, które mają metody watch, to istnieje tylko jedna metoda stop.

Tylko użytkownicy z odpowiednimi uprawnieniami mogą zatrzymać kanał. W szczególności:

  • Jeśli kanał został utworzony przez zwykłe konto użytkownika, tylko ta sama osoba korzystająca z tego samego klienta (identyfikowana przez identyfikatory klienta OAuth 2.0 z tokenów uwierzytelniających) może zatrzymać kanał.
  • Jeśli kanał został utworzony przez konto usługi, każdy użytkownik z tego samego klienta może go zatrzymać.

Poniższy przykładowy kod pokazuje, jak przestać otrzymywać powiadomienia:

POST https://www.googleapis.com/drive/v3/channels/stop
  
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

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