Notifiche per le modifiche alle risorse

Questo documento descrive come utilizzare le notifiche push per informare l'applicazione quando una risorsa cambia.

Panoramica

L'API Google Drive fornisce notifiche push che ti consentono di monitorare le variazioni nelle risorse. Puoi utilizzare questa funzionalità per migliorare le prestazioni della tua applicazione. Consente di eliminare i costi di rete e di calcolo aggiuntivi associati alle risorse di polling per determinare se sono cambiate. Ogni volta che una risorsa controllata cambia, l'API Google Drive invia una notifica alla tua applicazione.

Per utilizzare le notifiche push, devi eseguire due operazioni:

  • Imposta l'URL di destinazione o il ricevitore di callback "webhook".

    Si tratta di un server HTTPS che gestisce i messaggi di notifica delle API che vengono attivati quando una risorsa viene modificata.

  • Configura un (canale di notifica) per ogni endpoint delle risorse che vuoi guardare.

    Un canale specifica le informazioni di routing per i messaggi di notifica. Nell'ambito della configurazione del canale, devi identificare l'URL specifico su cui vuoi ricevere le notifiche. Ogni volta che una risorsa di un canale viene modificata, l'API Google Drive invia un messaggio di notifica come richiesta POST all'URL.

Attualmente, l'API Google Drive supporta le notifiche relative alle modifiche ai metodi files e changes.

Crea canali di notifica

Per richiedere notifiche push, devi configurare un canale di notifica per ogni risorsa da monitorare. Dopo aver configurato i canali di notifica, l'API Google Drive informa l'applicazione quando una risorsa guardata cambia.

Effettua richieste di orologio

A ogni risorsa dell'API Google Drive visibile è associato un metodo watch in un URI del seguente formato:

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

Per configurare un canale di notifica per i messaggi relativi alle modifiche a una particolare risorsa, invia una richiesta POST al metodo watch per la risorsa.

Ogni canale di notifica è associato sia a un determinato utente sia a una particolare risorsa (o insieme di risorse). Una richiesta watch non avrà esito positivo a meno che l'utente corrente o l'account di servizio non possieda o disponga dell'autorizzazione per accedere a questa risorsa.

Esempi

L'esempio di codice seguente mostra come utilizzare una risorsa channels per iniziare a controllare le modifiche a una singola risorsa files utilizzando il metodo 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.
}

L'esempio di codice seguente mostra come utilizzare una risorsa channels per iniziare a monitorare tutti i changes utilizzando il metodo 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.
}

Proprietà obbligatorie

Per ogni richiesta di tipo watch, devi fornire i seguenti campi:

  • Una stringa della proprietà id che identifica in modo univoco questo nuovo canale di notifica all'interno del progetto. Ti consigliamo di utilizzare un identificatore univoco universale (UUID) o qualsiasi stringa univoca simile. Lunghezza massima: 64 caratteri.

    Il valore dell'ID impostato viene riportato nell'intestazione HTTP X-Goog-Channel-Id di ogni messaggio di notifica che ricevi per questo canale.

  • Una stringa della proprietà type impostata sul valore web_hook.

  • Una stringa della proprietà address impostata sull'URL che ascolta e risponde alle notifiche per questo canale di notifica. Questo è l'URL di callback del webhook e deve utilizzare HTTPS.

    Tieni presente che l'API Google Drive è in grado di inviare notifiche a questo indirizzo HTTPS solo se sul tuo server web è installato un certificato SSL valido. I certificati non validi includono:

    • Certificati autofirmati.
    • Certificati firmati da una fonte non attendibile.
    • Certificati revocati.
    • Certificati con oggetto che non corrisponde al nome host di destinazione.

Proprietà facoltative

Puoi anche specificare questi campi facoltativi con la richiesta watch:

  • Una proprietà token che specifica un valore stringa arbitrario da utilizzare come token del canale. Puoi utilizzare i token del canale di notifica per vari scopi. Ad esempio, puoi utilizzare il token per verificare che ogni messaggio in arrivo sia per un canale creato dall'applicazione (per garantire che la notifica non sia oggetto di spoofing) o per instradare il messaggio alla destinazione corretta all'interno dell'applicazione in base allo scopo di questo canale. Lunghezza massima: 256 caratteri.

    Il token è incluso nell'intestazione HTTP X-Goog-Channel-Token in ogni messaggio di notifica che l'applicazione riceve per questo canale.

    Se utilizzi i token del canale di notifica, ti consigliamo di:

    • Utilizza un formato di codifica estensibile, come i parametri di query dell'URL. Esempio: forwardTo=hr&createdBy=mobile

    • Non includere dati sensibili come i token OAuth.

  • Una stringa della proprietà expiration impostata su un timestamp Unix (in millisecondi) della data e dell'ora in cui vuoi che l'API Google Drive interrompa l'invio dei messaggi per questo canale di notifica.

    Se un canale ha una scadenza, questa viene inclusa come valore dell'intestazione HTTP X-Goog-Channel-Expiration (in formato leggibile) in ogni messaggio di notifica che l'applicazione riceve per questo canale.

Per ulteriori dettagli sulla richiesta, consulta il metodo watch per i metodi files e changes in Riferimento API.

Guarda la risposta

Se la richiesta watch crea correttamente un canale di notifica, restituisce un codice di stato HTTP 200 OK.

Il corpo del messaggio della risposta alla pagina di visualizzazione fornisce informazioni sul canale di notifica appena creato, come mostrato nell'esempio riportato di seguito.

{
  "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.
}

Oltre alle proprietà che hai inviato nell'ambito della richiesta, le informazioni restituite includono anche resourceId e resourceUri per identificare la risorsa guardata su questo canale di notifica.

Puoi passare le informazioni restituite ad altre operazioni del canale di notifica, ad esempio quando vuoi interrompere la ricezione delle notifiche.

Per ulteriori dettagli sulla risposta, consulta il metodo watch per i metodi files e changes in Riferimento API.

Sincronizza messaggio

Dopo aver creato un canale di notifica per osservare una risorsa, l'API Google Drive invia un messaggio sync per indicare che le notifiche stanno iniziando. Il valore dell'intestazione HTTP X-Goog-Resource-State per questi messaggi è sync. A causa di problemi di temporizzazione della rete, è possibile ricevere il messaggio sync anche prima di ricevere la risposta del metodo watch.

Puoi ignorare la notifica sync, ma puoi anche utilizzarla. Ad esempio, se decidi di non conservare il canale, puoi utilizzare i valori X-Goog-Channel-ID e X-Goog-Resource-ID in una chiamata per interrompere la ricezione delle notifiche. Puoi anche utilizzare la notifica sync per eseguire alcune operazioni di inizializzazione e prepararti per gli eventi successivi.

Di seguito è mostrato il formato dei messaggi sync che l'API Google Drive invia all'URL di destinazione.

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

I messaggi di sincronizzazione hanno sempre un valore dell'intestazione HTTP X-Goog-Message-Number pari a 1. Ogni notifica successiva per questo canale ha un numero di messaggio maggiore di quello precedente, anche se i numeri dei messaggi non saranno sequenziali.

Rinnova canali di notifica

Un canale di notifica può avere una scadenza, con un valore determinato dalla tua richiesta oppure da eventuali limiti o valori predefiniti dell'API Google Drive (viene utilizzato il valore più restrittivo). La scadenza del canale, se presente, viene inclusa come timestamp Unix (in millisecondi) nelle informazioni restituite dal metodo watch. Inoltre, la data e l'ora di scadenza sono incluse (in un formato leggibile) in ogni messaggio di notifica ricevuto dall'applicazione per questo canale nell'intestazione HTTP X-Goog-Channel-Expiration.

Al momento, non è possibile rinnovare automaticamente un canale di notifica. Quando un canale sta per scadere, devi sostituirlo con uno nuovo chiamando il metodo watch. Come sempre, devi utilizzare un valore univoco per la proprietà id del nuovo canale. Tieni presente che è probabile che ci sia un periodo di "sovrapposizione" in cui sono attivi i due canali di notifica per la stessa risorsa.

Ricezione notifiche

Ogni volta che una risorsa controllata cambia, l'applicazione riceve un messaggio di notifica che descrive la modifica. L'API Google Drive invia questi messaggi come richieste POST HTTPS all'URL specificato come proprietà address per questo canale di notifica.

Interpretare il formato dei messaggi di notifica

Tutti i messaggi di notifica includono un insieme di intestazioni HTTP con prefissi X-Goog-. Alcuni tipi di notifiche possono anche includere un corpo del messaggio.

Intestazioni

I messaggi di notifica pubblicati dall'API Google Drive nell'URL di destinazione includono le seguenti intestazioni HTTP:

Titolo Descrizione
Presentare sempre
X-Goog-Channel-ID UUID o un'altra stringa univoca che hai fornito per identificare questo canale di notifica.
X-Goog-Message-Number Numero intero che identifica il messaggio per questo canale di notifica. Il valore per i messaggi sync è sempre 1. I numeri dei messaggi aumentano per ogni messaggio successivo sul canale, ma non sono sequenziali.
X-Goog-Resource-ID Un valore opaco che identifica la risorsa controllata. Questo ID è stabile in tutte le versioni dell'API.
X-Goog-Resource-State Il nuovo stato della risorsa che ha attivato la notifica. Valori possibili: sync, add, remove, update, trash, untrash o change .
X-Goog-Resource-URI Un identificatore della versione dell'API specifico per la risorsa controllata.
A volte presente
X-Goog-Changed Ulteriori dettagli sulle modifiche. Valori possibili: content, parents, children o permissions . Non fornito con sync messaggi.
X-Goog-Channel-Expiration Data e ora di scadenza del canale di notifica, espresse in formato leggibile. Presente solo se definito.
X-Goog-Channel-Token Token del canale di notifica impostato dalla tua applicazione e che puoi utilizzare per verificare l'origine della notifica. Presente solo se definito.

I messaggi di notifica per files e changes sono vuoti.

Esempi

Messaggio di notifica di modifica per files risorse, che non include un corpo della richiesta:

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

Messaggio di notifica di modifica per changes risorse, che include un corpo della richiesta:

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

Risposta alle notifiche

Per indicare l'esito positivo, puoi restituire uno dei seguenti codici di stato: 200, 201, 202, 204 o 102.

Se il servizio utilizza la libreria client dell'API di Google e restituisce 500,502, 503 o 504, l'API Google Drive riproverà con backoff esponenziale. Ogni altro codice di stato del reso è considerato un errore del messaggio.

Informazioni sugli eventi di notifica dell'API Google Drive

Questa sezione fornisce dettagli sui messaggi di notifica che puoi ricevere quando utilizzi le notifiche push con l'API Google Drive.

X-Goog-Resource-State Si applica a Consegnato quando
sync files, changes È stato creato un canale. Potrai iniziare a ricevere le relative notifiche.
add files È stata creata o condivisa una risorsa.
remove files Una risorsa esistente è stata eliminata o non è più condivisa.
update files Una o più proprietà (metadati) di una risorsa sono state aggiornate.
trash files Una risorsa è stata spostata nel cestino.
untrash files Una risorsa è stata rimossa dal cestino.
change changes Sono stati aggiunti uno o più elementi del log delle modifiche.

Per gli eventi update, potrebbe essere fornita l'intestazione HTTP X-Goog-Changed. L'intestazione contiene un elenco separato da virgole che descrive i tipi di modifiche apportate.

Tipo di modifica Indica
content Il contenuto della risorsa è stato aggiornato.
properties Una o più proprietà della risorsa sono state aggiornate.
parents Sono state aggiunte o rimosse una o più risorse padre.
children Uno o più elementi figlio delle risorse sono stati aggiunti o rimossi.
permissions Le autorizzazioni della risorsa sono state aggiornate.

Esempio con intestazione X-Goog-Changed:

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

Notifiche di arresto

La proprietà expiration stabilisce quando interrompere automaticamente le notifiche. Puoi scegliere di interrompere la ricezione delle notifiche per un determinato canale prima che scada chiamando il metodo stop al seguente URI:

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

Questo metodo richiede che tu fornisca almeno le proprietà id e resourceId del canale, come mostrato nell'esempio riportato di seguito. Tieni presente che se l'API Google Drive ha diversi tipi di risorse con metodi watch, esiste un solo metodo stop.

Solo gli utenti che dispongono dell'autorizzazione appropriata possono interrompere un canale. In particolare:

  • Se il canale è stato creato da un normale account utente, solo lo stesso utente dello stesso client (come identificato dagli ID client OAuth 2.0 dei token di autenticazione) che ha creato il canale può interrompere il canale.
  • Se il canale è stato creato da un account di servizio, qualsiasi utente dello stesso client può interromperlo.

Il seguente esempio di codice mostra come interrompere la ricezione delle notifiche:

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