プッシュ通知



  • この記事は、Google Drive™ APIに関する記事を和訳したものです。
  • 原文: Push Notifications
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年6月ころです。

このドキュメントでは、リソースが変更したとき、あなたのアプリケーションに通知する、プッシュ通知を使用する方法について説明しています。

概要

Drive APIは、リソースへの変更を監視させるプッシュ通知を提供しています。 あなたのアプリケーションのパフォーマンスを改善するために、この機能を使用することができます。 それは、それらが変更したかどうかを判断するためにリソースをポーリングすることに関連する、余分なネットワークおよび計算コストを排除できるようにします。 監視されたリソースが変更するたびに、Drive APIはあなたのアプリケーションに通知します。

プッシュ通知を使用するには、次の 3つのことを行う必要があります:

  • あなたの受信 URLのドメインを登録します。

    例えば、あなたの受信 URLとして https://mydomain.com/notificationsを使用する予定であるならば、https://mydomain.comを登録する必要があります。

  • あなたの受信 URL、あるいは "Webhook" コールバックレシーバをセットアップします。

    これは、リソースが変更したときにトリガされる API通知メッセージを処理する HTTPSサーバです。

  • 監視したいそれぞれのリソースのエンドポイントのために、通知チャネルをセットアップします。

    チャネルは、通知メッセージのためのルーティング情報を指定します。 チャネルのセットアップの一環として、通知を受信したい特定の URLを指定します。 チャネルのリソースが変更されるたびに、Drive APIは、その URLに POSTリクエストとして、通知メッセージを送信します。

現在、Drive APIは、Filesおよび Changesリソースへの変更への通知をサポートしています。

あなたのドメインを登録する

プッシュ通知チャネルをセットアップする前に、プッシュ通知メッセージを受信するために使用する予定である、任意の URLのドメインを登録しなければなりません。 また、ドメインを登録する前に、まず、それを所有していることを検証しなければなりません。 このステップは、他人のドメインにメッセージを送信するためにプッシュを使用しないための、乱用行為防止対策です。

Step 1: ドメインを所有していることを検証する

あなたのドメインを登録する前に、あなたがそれを所有していることを検証する必要があります。 Search Consoleを使用して、サイトの検証プロセスを完了してください。 詳細については、site verification helpドキュメントを参照してください。

Step 2: あなたのドメインを登録する

あなたのプロジェクトのために許可されたドメインのいずれかとして検証されたドメインを登録するには、次の手順を行います:

  1. API Consoleにて、Domain verification pageに移動します。
  2. Add domainをクリックします。
  3. フォームに記入し、それから、再び Add domainをクリックします。

この時点で、Google API Consoleは、Search Consoleにて検証されたものに対して、リスト内のすべてのドメインをチェックします。 すべてのドメインを適切に検証したと想定すると、ページは、許可されたドメインの新しいリストを示すために更新されます。 今、プッシュ通知を受信するために、これらのドメインのいずれかを使用することができます。

通知チャネルを作成する

プッシュ通知をリクエストするには、監視したいそれぞれのリソースのために通知チャネルをセットアップする必要があります。 あなたの通知チャネルがセットアップされた後、Drive APIは、任意の監視されたリソースの変更のとき、あなたのアプリケーションに通知するでしょう。

監視リクエストを作る

それぞれの監視可能な Drive APIリソースは、次の形式の URIに、関連付けられた watchメソッドを持っています:

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

特定のリソースへの変更についてのメッセージのために通知チャネルをセットアップするには、リソースのための watchメソッドに POSTリクエストを送信します。

それぞれの通知チャネルは、特定のユーザおよび特定のリソース(あるいはリソースのセット)の両方に関連付けられています。 watchリクエストは、現在のユーザあるいはサービスアカウントが、このリソースを所有、あるいはアクセスするための適切なパーミッションを持っていない限り、成功しないでしょう。

単一のファイルリソースへの変更のための監視を開始するには:

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

すべての変更リソースのための監視を開始するには:

POST https://www.googleapis.com/drive/v3/changes/watch
Authorization: Bearer auth_token_for_current_user
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 channel token.
  "expiration": 1426325213000 // (Optional) Your requested channel expiration time.
}

必須のプロパティ

それぞれの watchリクエストごとに、次を提供する必要があります:

  • あなたのプロジェクト内でこの新しい通知チャネルをユニークに識別する、idプロパティ文字列。 私たちは、ユニバーサルにユニークな識別子(UUID)あるいは類似のユニークな文字列を使用することをお勧めします。 最大長: 64文字。

    セットした ID値は、このチャネルのために受信しるすべての通知メッセージの X-Goog-Channel-Id HTTPヘッダ内にエコーバックされます。

  • web_hookをセットされた typeプロパティ文字列。

  • この通知チャネルのための通知をリッスンし、応答する URLをセットされた addressプロパティ文字列。 これは、あなたの Webhookコールバック URLで、それは HTTPSを使用しなければなりません。

    Drive APIは、有効な SSL証明書があなたのウェブサーバ上にインストールされている場合にのみ、この HTTPSアドレスに通知を送信することができるでしょう。 無効な証明書は次のとおりです:

    • 自己署名された証明書。
    • 信頼できないソースによって署名された証明書。
    • 取り消された証明書。
    • ターゲットホスト名と一致しないサブジェクトを持つ証明書。

オプションのプロパティ

あなたの watchリクエストを用いて、これらのオプションのフィールドを指定することもできます:

  • チャネルトークンとして使用するための任意の文字列値を指定する、tokenプロパティ。 さまざまな目的のために通知チャネルを使用することができます。 例えば、それぞれの受信メッセージがあなたのアプリケーションが作成したチャネルのものであることを検証するために — 通知がスプーフィングされていないことを保証するために — あるいは、このチャネルの目的に基づいてあなたのアプリケーション内の正しい宛先にメッセージをルーティングするために、このトークンを使用することができます。 最大長: 256文字。

    トークンは、このチャネルのためにあなたのアプリケーションが受信するすべての通知メッセージ内の X-Goog-Channel-Token HTTPヘッダに含まれています。

    もし通知チャネルトークンを使用するならば、私たちは次のことをお勧めします:

    • URLクエリパラメータといった、拡張可能なエンコーディング形式を使用してください。 例: forwardTo=hr&createdBy=mobile

    • OAuthトークンといった、機密データを含めないでください。

  • Drive APIがこの通知チャネルのためにメッセージを送信することを停止させたい日時の Unix timestamp(ミリ秒単位)がセットされた expirationプロパティ文字列。

    もしチャネルが有効期限を持っているならば、それは、あなたのアプリケーションがこのチャネルのために受信するすべての通知メッセージにて X-Goog-Channel-Expiration HTTPヘッダ(この時刻は人間が読み取り可能な形式)の値として含まれています。

リクエストの詳細については、APIリファレンスにて Filesおよび Changesリソースの 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 time as Unix timestamp (in ms), if applicable.
}

あなたのリクエストの一部として送信されたプロパティに加えて、返された情報は、この通知チャネルで監視されているリソースを識別するために resourceIdおよび resourceUriを含んでいます。

返された情報に、通知の受信を停止するといった他の通知チャネルの操作を渡すことができます。

レスポンスの詳細については、APIリファレンスにて Filesおよび Changeswatchメソッドを参照してください。

同期メッセージ

リソースを監視するために新しい通知チャネルを作成した後、Drive APIは、通知が開始していることを示すために syncメッセージを送信します。 これらのメッセージの X-Goog-Resource-State HTTPヘッダは、syncです。 ネットワークのタイミングの問題によって、watchメソッドの応答を受信する前に、syncメッセージを受信する可能性があります。

sync通知を無視することは安全ですが、それを使用することもできます。 例えば、もしチャネルを維持したくなければ、通知の受信を停止するへの呼び出しにて X-Goog-Channel-IDおよび X-Goog-Resource-IDを使用することができます。 さらには、後のイベントを準備するための幾つかの初期化を行うために、sync通知を使用することができます。

Drive APIがあなたの受信 URLに送信する 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 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

同期メッセージは、常に、値が 1である X-Goog-Message-Number HTTPヘッダを持っています。 このチャネルのためのそれぞれの後続の通知は、以前のものより大きなメッセージ番号を持っているでしょうが、そのメッセージ番号は連続しないでしょう。

通知チャネルをリニューアルする

通知チャネルは有効期限を持つことができます、それは、あなたのリクエストによって、あるいは Google Drive APIの内部制限、あるいはデフォルトのいずれかによって決定された値を伴います(より制限された値が使用されます)。 チャネルの有効期限は、もしそれがそれを持っているならば、watchメソッドによって返される情報にて Unixタイムスタンプ(ミリ秒単位)として含まれています。 さらに、有効期限の日時は、あなたのアプリケーションがこのチャネルのために受信するすべての通知メッセージ内に、X-Goog-Channel-Expiration HTTPヘッダに含まれています(人間が読み取り可能な形式で)。

現在、通知チャネルを自動的にリニューアルする方法はありません。 チャネルがその有効期限に近づいているとき、watchメソッドを呼び出すことによって新しいものを作成しなければなりません。 いつものように、新しいチャネルの idプロパティには、ユニークな値を使用しなければなりません。 同じリソースのための 2つの通知チャネルがアクティブであるとき、"overlap" する期間がある可能性があることに注意してください。

通知を受信する

監視されたリソースが変更されるたびに、あなたのアプリケーションは変更を示す通知メッセージを受け取るでしょう。 Drive APIは、この通知チャネルのために "address" として指定された URLに、HTTPS POSTリクエストとして、これらのメッセージを送信します。

通知メッセージの形式を理解する

すべての通知メッセージは、X-Goog-接頭辞を持つ、一連の HTTPヘッダを含んでいます。 幾つかの通知タイプは、メッセージボディを含むこともできます。

ヘッダ

あなたの受信 URLに Drive APIによってポストされた通知メッセージは、次の HTTPヘッダを含んでいます:

ヘッダ 説明
常に存在する
X-Goog-Channel-ID この通知チャネルを識別するために提供した、UUIDあるいは他のユニークな文字列。
X-Goog-Message-Number この通知チャネルのためのこのメッセージを識別する整数。 値は、syncメッセージの場合、常に 1です。 メッセージ番号は、チャネル上のそれぞれの後続のメッセージごとに増加しますが、それらは連続したものではありません。
X-Goog-Resource-ID 監視されたリソースを識別する不透明な値。 この IDは、APIバージョンを通して安定しています。
X-Goog-Resource-State 新しいリソースの状態、それは、通知をトリガしたものです。 可能な値: syncaddremoveupdatetrashuntrash、あるいは change
X-Goog-Resource-URI 監視されたリソースのための APIバージョン固有の識別子。
時には存在する
X-Goog-Changed 変更についての追加の詳細。 可能な値: contentparentschildrenpermissionssyncメッセージでは提供されません。
X-Goog-Channel-Expiration 通知チャネルの有効期限の日時、それは、人間が読み取り可能な形式にて表されます。 定義されている場合にのみ存在します。
X-Goog-Channel-Token あなたのアプリケーションによってセットされた通知チャネルトークン、それは、通知のソースを検証するために使用することができます。 定義されている場合にのみ存在します。

ファイルおよび変更のための通知メッセージは、空です。

ファイルリソースのための変更通知メッセージです、それは、リクエストボディを含んでいません:

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

変更リソースのための変更通知メッセージです、それは、リクエストボディを含んでいます:

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

通知に応答する

成功を示すために、次のステータスコードのいずれかを返すことができます: 200201202204あるいは 102。 もしあなたのサービスが 500502503、あるいは 504を返すならば、Drive APIは、exponential backoffを用いてリトライするでしょう。

他のリターンコードのすべては、メッセージの失敗であると考慮され、Drive APIは、この特定の通知をリトライしないでしょう。

Drive API通知イベントを理解する

このセクションでは、Drive APIを用いてプッシュ通知を使用するときに受信することができる、通知メッセージの詳細について説明します。

X-Goog-Resource-State Applies to Delivered when
sync Files, Changes 新しいチャネルが正常に作成されたとき。 そのための通知を受信し始めることを期待することができます。
add Files 新しいリソースが作成あるいは共有されたとき。
remove Files 既存のリソースが削除あるいは共有解除されたとき。
update Files リソースの 1つ以上のプロパティ(メタデータ)が更新されたとき。
trash Files リソースがゴミ箱に移動されたとき。
untrash Files リソースがゴミ箱から削除されたとき。
change Changes 1つ以上の新しい変更ログアイテムが追加されたとき。

updateイベントの場合、X-Goog-Changed HTTPヘッダが提供されるかもしれません。 そのヘッダは、発生した変更のタイプを説明するコンマ区切りのリストを含んでいます。

Change type Indicates
content リソースのコンテンツが更新された。
properties リソースの 1つ以上のプロパティが更新された。
parents リソースの 1つ以上の親が、追加あるいは削除された。
children リソースの 1つ以上の子が、追加あるいは削除された。
permissions リソースのパーミッションが更新された。

X-Goog-Changedヘッダを伴う例:

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

通知を停止する

有効期限は、通知が自動的に停止するときです。 次の URLで stopメソッドを呼び出すことによって、それが失効する前に、特定のチャネルのための通知を受信することを停止することを選択することができます。

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

このメソッドは、次の例に示すように、少なくともチャネルの idおよび resourceIdプロパティを提供することを必要とします。 Drive APIが、watchメソッドを持つ幾つかのタイプのリソースを持っている場合でさえ、stopメソッドは 1つのみです。

正しいパーミッションを伴うユーザのみがチャネルを停止することができます。 特に:

  • もしチャネルが通常のユーザアカウントによって作成されたならば、チャネルを作成した同じクライアント(認証トークンから OAuth 2.0クライアントによって識別される)からの同じユーザのみがチャネルを停止することができます。
  • もしチャネルがサーバアカウントによって作成されたならば、同じクライアントからの任意のユーザはチャネルを停止することができます。
POST https://www.googleapis.com/drive/v3/channels/stop
Authorization: Bearer {auth_token_for_current_user}
Content-Type: application/json

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