ロングポーリングイベント

ガイドイベントロングポーリングイベント

ロングポーリングイベント

Boxアカウントでアクティビティのリアルタイム通知を取得するために、OPTIONS /events APIのロングポーリング機能を使用できます。

cURL
curl -X OPTIONS https://api.box.com/2.0/events \
     -H 'Authorization: Bearer <ACCESS_TOKEN>'
Java
EventStream stream = new EventStream(api);
stream.addListener(new EventListener() {
    public void onEvent(BoxEvent event) {
        // Handle the event.
    }
});
stream.start();
Python
events = client.events().generate_events_with_long_polling()
for event in events:
    print('Got {0} event'.format(event.event_type))
Node
client.events.getEventStream(function(err, stream) {

	if (err) {
		// handle error
	}

	stream.on('data', function(event) {
		// handle the event
	});
});

ロングポーリングはユーザーイベントにのみ使用できます。エンタープライズイベントではロングポーリングがサポートされません。

ロングポーリング

ロングポーリングでは、HTTPリクエストを開き、サーバーが応答を送信するまでそのリクエストを開いたままにして、そのプロセスを何度も繰り返して更新された応答を受信します。

SDKには、新しいイベントに対するロングポーリングにより、イベントフィードをイベントストリームに変換するためのサポートが組み込まれています。

ロングポーリングURL

ロングポーリングを使用するには、まず、リクエストをOPTIONS /events APIに送信し、ロングポーリングURLを取得します。

curl -X OPTIONS https://api.box.com/2.0/events \
    -H "authorization: Bearer ACCESS_TOKEN"
{
  "chunk_size": 1,
  "entries": [
    {
      "type": "realtime_server",
      "url": "http://2.realtime.services.box.net/subscribe?channel=cc807c9c4869ffb1c81a&stream_type=all",
      "ttl": 10,
      "max_retries": 10,
      "retry_timeout": 610
    }
  ]
}

リアルタイムサーバー

次に、指定されたURLにGETリクエストを実行してイベントのリッスンを開始します。監視対象のアカウントでイベントが発生すると、new_changeという値を持つ応答が送信されます。応答にはその他の詳細は含まれていません。

この単一の応答は、最新の既知のstream_positionを使用してGET /eventsエンドポイントにリクエストを送信するなど、後続の処理を促すことを目的としています。

切断と再接続

サーバーは、この応答を送信した後に接続を閉じます。この時点でアプリケーションがイベントのリッスンを再開するには、ロングポーリングのプロセスを繰り返す必要があります。

アプリケーションがリアルタイムサーバーに接続してもその後しばらくイベントが発生しないと、接続が閉じられ、reconnectという値が返されます。この状況になると、アプリケーションはプロセスを再開するためにOPTIONS /eventsに対する新しい呼び出しを実行する必要があります。

タイムアウトと再試行

retry_timeoutで指定した秒数以内にアプリケーションがイベントを受け取らなければ、アプリケーションはリアルタイムサーバーに再接続できます。これは、ネットワークエラーが発生すると必要になる場合があります。

アプリケーションがリアルタイムサーバーに対してGETリクエストを送信したときにmax_retriesエラーが返された場合は、/events APIに対してOPTIONS呼び出しを実行してプロセスを再開する必要があります。