推播通知

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

總覽

Google Calendar API 提供推播通知,可讓你監控 調整資源運用方式您可以運用這項功能提高 應用程式可讓您擺脫額外的網路和運算資源 輪詢資源判定資源是否發生變化所衍生的費用。 每當已監控的資源變更時,Google Calendar API 就會通知您 應用程式。

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

  • 設定接收網址或「Webhook」回呼接收接聽程式。

    這個 是 HTTPS 伺服器,可處理 會在資源變更時觸發

  • 為每個要更新的資源端點設定 (「通知管道」) 手錶。

    管道會指定通知的轉送資訊 訊息。設定頻道時,您必須指明含有 選擇要接收通知的意願只要頻道資源有所變更 Google Calendar API 會以 POST 的形式傳送通知訊息 要求至該網址

目前,Google Calendar API 支援通知使用者 AclCalendarListEventsSettings 資源。

建立通知管道

如要請求推播通知,請設定通知管道 選擇要監控的資源設定通知管道後 後,Google Calendar API 會在任何已查看的資源時,通知應用程式 並輸入變更內容

提出觀看要求

每項可觀察的 Google Calendar API 資源都有相關聯的 watch 方法,格式如下:

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

若要設定通知管道,以便接收有關 請將 POST 要求傳送給 資源的 watch 方法。

每個通知管道都與特定使用者相關聯 對特定資源 (或一組資源) 來說watch 要求 就是目前的使用者 擁有這項資源的存取權,或有權存取這項資源。

範例

開始監控特定日曆的活動集合變更:

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

必要屬性

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

  • 專門用於識別此項目的 id 屬性字串 新的通知管道為求明確,建議採用 全域專屬 ID (UUID) 或類似 不重複的字串。長度上限:64 個半形字元。

    您設定的 ID 值會回傳到 每則通知的 X-Goog-Channel-Id HTTP 標頭 的訊息。

  • 設為值的 type 屬性字串 web_hook

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

    請注意,Google Calendar API 可以傳送通知到 您必須安裝有效的 SSL 憑證 網路伺服器無效的憑證包括:

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

選用屬性

您也可以透過 watch 要求:

  • 指定任意字串的 token 屬性 值做為頻道符記。您可以使用通知管道 符記舉例來說,您可以使用 以便驗證每則傳入訊息的代表管道 應用程式建立元件,以確保使用者不會收到通知 或將此郵件轉送至該網路中的正確目的地 追蹤您的應用程式長度上限: 256 個半形字元,

    權杖會包含在 每則通知都包含 X-Goog-Channel-Token HTTP 標頭 您應用程式收到的訊息

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

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

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

    ,瞭解如何調查及移除這項存取權。
  • expiration 屬性字串設為 Unix 時間戳記 您希望 Google Calendar API 傳送 停止傳送這個通知管道的訊息。

    如果管道設有到期時間,系統就會將其納入 X-Goog-Channel-Expiration HTTP 標頭 (人類可讀) 格式) 傳送給您的 應用程式獲得的收益

如要進一步瞭解要求,請參閱 watch 方法。 API 參考資料中有關 AclCalendarListEventsSettings 的資源。

觀看回覆

如果 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/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.
}

除了您在要求中傳送的屬性之外, 傳回的資訊也包括 resourceIdresourceUri,用於識別此項目正在觀看的資源 通知管道

您可以將傳回的資訊傳遞至其他通知管道 例如您想要停止接收 通知

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

同步處理訊息

建立要查看資源的通知管道後 Google Calendar API 會傳送 sync 訊息,表示 正在啟動通知。X-Goog-Resource-State HTTP 這些郵件的標頭值是 sync。因網路限制 時間問題,有可能收到 sync 訊息 您就會收到 watch 方法回應

您可以放心忽略 sync 通知,但您可以放心 也能使用這項服務例如,當您決定 管道,您可以使用 X-Goog-Channel-ID 和 呼叫中的 X-Goog-Resource-ID停止接收通知。您也可以使用 sync 通知,用於進行一些初始化準備 之後的事件

Google Calendar 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 Calendar API 內部限制決定。 或預設值 (使用限制較嚴格的值)。頻道的有效期限 時間 (如果有的話),也會納入 Unix 時間戳記watch 方法傳回的資訊 (以毫秒為單位)。此外, 每個 通知訊息,您的應用程式在 X-Goog-Channel-Expiration HTTP 標頭。

目前目前無法自動續訂通知管道。時間 某個管道即將到期,您必須呼叫 watch 方法。一如往常,您必須在 新頻道的 id 屬性。請注意 視為「重疊」系統會在這段時間內 是否正在使用相同資源

接收通知

每當已監控的資源變更時,應用程式就會收到 系統會發送通知訊息來說明變更Google Calendar API 會將 視為 HTTPS POST 要求,並對您所指定的網址 這則通知的 address 屬性 頻道。

解讀通知訊息格式

所有通知訊息都包含一組 HTTP 標頭 X-Goog- 前置字串。 部分通知類型還包括 訊息內文。

標頭

Google Calendar API 對您接收的通知訊息 網址包含下列 HTTP 標頭:

標頭 說明
一律顯示在所有人的主畫面上
X-Goog-Channel-ID UUID 或其他專屬字串,用來識別這個 ID 通知管道
X-Goog-Message-Number 用於識別此通知訊息的整數 頻道。sync 訊息的值一律為 1。訊息 頻道後續訊息的成長率 順序。
X-Goog-Resource-ID 識別受監控資源的不透明值。這個 ID 是 各個 API 版本皆保持穩定
X-Goog-Resource-State 觸發通知的新資源狀態。 可能的值包括: syncexistsnot_exists
X-Goog-Resource-URI 受監控資源的 API 版本專屬 ID。
有時會
X-Goog-Channel-Expiration 通知管道到期的日期和時間,以 人類可讀的格式只有在已定義的情況下才會顯示。
X-Goog-Channel-Token 由應用程式設定的通知管道符記 並用於驗證通知來源出現以下情況時才會顯示

Google Calendar API 發布至您接收網址的通知訊息中不含訊息內文。這些訊息不含已更新資源的具體資訊,您需要發出另一個 API 呼叫,才能查看完整的變更詳細資料。

範例

變更事件集合的通知訊息:

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

根據通知內容採取行動

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

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

瞭解 Google Calendar API 通知事件

本節詳細說明瞭您可操作的通知訊息 透過 Google Calendar API 使用推播通知時接收相關通知。

X-Goog-Resource-State 套用至 送達時間
sync ACL、日曆清單、活動、設定。 已成功建立新頻道。您應該會開始收到有關提醒的通知。
exists ACL、日曆清單、活動、設定。 資源有所變更。可能的變更包括建立新資源,或是修改或刪除現有資源。

停止通知

expiration 屬性可控制自動停止通知的時間。你可以 選擇停止接收特定頻道的通知 過期方法是呼叫 stop 方法,呼叫期限為 以下 URI:

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

使用這個方法時,您至少必須提供頻道的 idresourceId 屬性,如 範例。請注意,如果 Google Calendar API 提供數種 含有 watch 方法的資源,但只有一個方法 stop 方法。

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

  • 如果頻道是由一般使用者帳戶所建立,則只有 來自同一用戶端的 OAuth 2.0 用戶端 ID 驗證權杖) 建立管道時即可停止管道。
  • 如果頻道是由服務帳戶建立,則該帳戶的所有使用者 用戶端即可停止頻道。

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

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

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