資源變更通知

本文件說明如何使用推播通知,在資源變更時通知應用程式。

總覽

Google Drive API 提供推播通知,可讓您監控資源的變更情形。您可以利用此功能提高應用程式的效能。可讓您消除與輪詢資源相關的額外網路和運算費用,以便判斷資源是否發生變化。只要觀察的資源有任何變更,Google Drive API 就會通知您的應用程式。

若要使用推播通知,您必須執行下列兩項操作:

  • 設定接收網址或「Webhook」回呼接收器。

    這個 HTTPS 伺服器會處理在資源變更時觸發的 API 通知訊息。

  • 為您要監控的每個資源端點設定 (「通知管道」)。

    管道會指定通知訊息的轉送資訊。設定頻道的過程中,您必須指定要接收通知的確切網址。每次管道的資源變更時,Google Drive API 都會以 POST 要求的形式傳送通知到該網址。

目前,Google Drive API 支援 fileschanges 方法的異動通知。

建立通知管道

若要要求推播通知,您必須針對要監控的每項資源設定通知管道。設定通知管道後,只要有任何已查看的資源變更,Google Drive API 就會通知應用程式。

提出觀看要求

每項可觀察的 Google Drive API 資源都有一個關聯的 watch 方法,其 URI 格式如下:

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

如要為特定資源發生變更的訊息設定通知管道,請傳送 POST 要求至資源的 watch 方法。

每個通知管道都與特定使用者和特定資源 (或一組資源) 相關聯。除非目前的使用者或服務帳戶具備這項資源的存取權,或是具備存取這項資源的權限,watch 要求才能成功。

示例

以下程式碼範例顯示如何使用 channels 資源開始透過 files.watch 方法監控單一 files 資源的變更:

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

以下程式碼範例說明如何使用 channels 資源開始監控所有 changeschanges.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.
}

必要屬性

每個 watch 要求都必須提供下列欄位:

  • id 屬性字串,專門用來在專案中識別這個新通知管道。建議您使用通用唯一識別碼 (UUID) 或任何類似的不重複字串。長度上限:64 個半形字元。

    您設定的 ID 值會回傳至您針對此管道收到的每則通知訊息的 X-Goog-Channel-Id HTTP 標頭中。

  • 設為 web_hook 值的 type 屬性字串。

  • address 屬性字串,設為監聽並回應這個通知管道的通知。這是您的 Webhook 回呼網址,必須使用 HTTPS。

    請注意,您的網路伺服器必須安裝有效的 SSL 憑證,Google Drive API 才能傳送通知到這個 HTTPS 位址。無效的憑證包括:

    • 自行簽署的憑證。
    • 由不受信任的來源所簽署的憑證。
    • 已撤銷的憑證。
    • 憑證的主體與目標主機名稱不符。

選用屬性

您也可以使用 watch 要求指定這些選用欄位:

  • token 屬性,用來指定要做為頻道權杖的任意字串值。您可以將通知管道權杖用於多種用途。例如,您可以使用權杖來確認每則傳入的訊息都來自應用程式建立的管道,確保通知未遭到假冒,或是能依據此管道的用途,將訊息轉送至應用程式中的正確目的地。長度上限:256 個字元。

    權杖包含在應用程式針對此管道收到的每則通知訊息的 X-Goog-Channel-Token HTTP 標頭中。

    如果你使用通知管道權杖,建議您:

    • 使用經過延伸的編碼格式,例如網址查詢參數。範例:forwardTo=hr&createdBy=mobile

    • 請勿加入 OAuth 權杖等機密資料。

  • 針對您希望 Google Drive API 停止傳送這個通知管道訊息的日期和時間,請將 expiration 屬性字串設為以毫秒為單位的 Unix 時間戳記

    如果管道設有到期時間,那麼應用程式在這個管道收到的每則通知訊息中,都會包含為 X-Goog-Channel-Expiration HTTP 標頭的值 (使用者可理解的格式)。

如要進一步瞭解該項要求,請參閱 API 參考資料中 fileschanges 方法的 watch 方法。

觀看回覆

如果 watch 要求成功建立通知管道,則會傳回 HTTP 200 OK 狀態碼。

手錶回應的訊息主體會提供您剛建立的通知管道相關資訊,如以下範例所示。

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

除了您在要求中傳送的屬性之外,傳回的資訊也會包含 resourceIdresourceUri,以識別此通知管道正在監控的資源。

您可以將傳回的資訊傳遞至其他通知管道作業,例如當您想停止接收通知時。

如要進一步瞭解回應,請參閱 API 參考資料中 fileschanges 方法的 watch 方法。

同步處理訊息

建立用來監控資源的通知管道後,Google Drive API 會傳送 sync 訊息,指出通知正在啟動。這些訊息的 X-Goog-Resource-State HTTP 標頭值為 sync。由於網路時間問題,即使您尚未收到 watch 方法回應,仍可能收到 sync 訊息。

您可以放心忽略 sync 通知,但也可以使用通知。例如,如果您決定不想保留管道,可以在呼叫停止接收通知的呼叫中使用 X-Goog-Channel-IDX-Goog-Resource-ID 值。此外,您也可以使用 sync 通知執行一些初始化作業,為後續事件做好準備。

Google Drive API 傳送至您接收網址的 sync 訊息格式如下所示。

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

同步處理郵件的 X-Goog-Message-Number HTTP 標頭值一律為 1。這個管道的後續通知都有訊息編號大於前一則,但訊息編號不會依序。

更新通知管道

通知管道可以設有到期時間,其值取決於您的要求,或是由任何 Google Drive API 內部限製或預設值決定 (使用較嚴格的值)。如果管道有到期時間,系統會在 watch 方法傳回的資訊中,以 Unix 時間戳記 (以毫秒為單位) 的形式加入這個值。此外,應用程式針對這個頻道收到的每則通知訊息,都會在 X-Goog-Channel-Expiration HTTP 標頭中納入到期日和時間 (使用者可理解的格式)。

目前目前無法自動續訂通知管道。當管道即將到期時,您必須呼叫 watch 方法,將其替換為新的管道。一如往常,您必須為新管道的 id 屬性使用不重複的值。請注意,當相同資源的兩個通知管道處於啟用狀態時,可能會有「重疊」的時間範圍。

接收通知

每當已監控的資源變更時,應用程式就會收到說明變更的通知訊息。Google Drive API 會以 HTTPS POST 要求的形式將這些訊息傳送至您指定的網址,做為此通知管道的 address 屬性

解讀通知訊息格式

所有通知訊息都含有一組具有 X-Goog- 前置字串的 HTTP 標頭。部分通知類型也可含有訊息內文。

標頭

Google Drive API 發布至您接收網址的通知訊息包含下列 HTTP 標頭:

標頭 說明
一律顯示在所有人的主畫面上
X-Goog-Channel-ID UUID 或其他專屬字串,用來識別這個通知管道。
X-Goog-Message-Number 整數,用於識別這個通知管道的訊息。sync 訊息的值一律為 1。頻道後續每則訊息的簡訊數量會增加,但訊息順序不會依序。
X-Goog-Resource-ID 識別受監控資源的不透明值。這個 ID 在各個 API 版本中皆為固定。
X-Goog-Resource-State 觸發通知的新資源狀態。可能的值: syncaddremoveupdatetrashuntrashchange
X-Goog-Resource-URI 受監控資源的 API 版本專屬 ID。
有時會
X-Goog-Changed 變更的其他詳細資料。 可能的值:contentparentschildrenpermissions。不含 sync 訊息。
X-Goog-Channel-Expiration 通知管道到期的日期和時間,以使用者可理解的格式表示。只有在已定義的情況下才會顯示。
X-Goog-Channel-Token 由應用程式設定的通知管道權杖,可用來驗證通知來源。只有在已定義的情況下才會顯示。

files」和「changes」的通知訊息沒有任何內容。

示例

files 資源的變更通知訊息,但不含要求主體:

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

changes 資源的變更通知訊息,包含要求主體:

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

根據通知內容採取行動

如要表示成功,您可以傳回下列任一狀態碼:200201202204102

如果您的服務使用 Google 的 API 用戶端程式庫並傳回 500502503504,Google Drive API 會以指數輪詢重試。其他所有傳回狀態碼都視為郵件失敗。

瞭解 Google Drive API 通知事件

本節將詳細說明搭配 Google Drive API 使用推播通知時,可收到哪些通知訊息。

X-Goog-Resource-State 套用至 送達時間
sync fileschanges 已成功建立頻道。您應該會開始收到有關提醒的通知。
add files 已建立或共用資源。
remove files 已刪除或取消共用現有資源。
update files 資源的一或多個屬性 (中繼資料) 已更新。
trash files 已將資源移至垃圾桶。
untrash files 已將資源從垃圾桶中移除。
change changes 已新增一或多個變更記錄項目。

如果是 update 事件,系統可能會提供 X-Goog-Changed HTTP 標頭。該標頭會包含以半形逗號分隔的清單,說明各種發生的變更類型。

變更類型 意義
content 資源內容已更新。
properties 一或多項資源屬性已更新。
parents 已新增或移除一或多個資源父項。
children 已新增或移除一或多個資源子項。
permissions 已更新資源權限。

標頭為 X-Goog-Changed 的範例:

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

停止通知

expiration 屬性可控制自動停止通知的時間。您可以透過下列 URI 呼叫 stop 方法,選擇在特定頻道到期前停止接收通知:

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

使用這個方法時,您至少須提供頻道的 idresourceId 屬性,如以下範例所示。請注意,如果 Google Drive API 包含多種具有 watch 方法的類型資源,那麼只有一個 stop 方法。

只有具備適當權限的使用者才能停止頻道。請特別注意以下幾點:

  • 如果管道是由一般使用者帳戶所建立,則只有建立管道的相同用戶端 (透過驗證權杖的 OAuth 2.0 用戶端 ID 加以識別) 的使用者才能停止管道。
  • 如果管道是由服務帳戶建立,則同一個用戶端的任何使用者都能停止管道。

以下程式碼範例說明如何停止接收通知:

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