ドキュメント

§Comet

§Cometでチャンクレスポンスを使用する

チャンクレスポンスの一般的な用途は、Cometソケットを作成することです。

Cometソケットは、<script>要素のみを含むチャンク化されたtext/htmlレスポンスです。各チャンクに対し、Webブラウザによってすぐに実行されるJavaScriptを含む<script>タグを記述します。このようにして、サーバーからWebブラウザにイベントをライブ送信できます。メッセージごとに、JavaScriptコールバック関数を呼び出す<script>タグでラップし、チャンクレスポンスに書き込みます。

Ok.chunkedは、Akka Streamsを活用してFlow[ByteString]を取得するため、要素のFlowを送信し、各要素がエスケープされてJavascriptメソッドでラップされるように変換できます。CometヘルパーはCometソケットを自動化し、ブラウザの互換性のために初期の空白バッファデータを送信し、文字列メッセージとJSONメッセージの両方をサポートします。

§Cometのインポート

Cometヘルパーを使用するには、次のクラスをインポートします

import org.apache.pekko.stream.scaladsl.Source
import org.apache.pekko.stream.Materializer
import play.api.http.ContentTypes
import play.api.libs.json._
import play.api.libs.Comet
import play.api.mvc._

また、マテリアライザーも必要になります。これは、DIシステムからakka.stream.Materializerを取得するのが最適です。

§文字列フローでCometを使用する

フローを介して文字列メッセージを送信するには、次のようにします

def cometString = Action {
  implicit val m                      = materializer
  def stringSource: Source[String, _] = Source(List("kiki", "foo", "bar"))
  Ok.chunked(stringSource.via(Comet.string("parent.cometMessage"))).as(ContentTypes.HTML)
}

§JSONフローでCometを使用する

フローを介してJSONメッセージを送信するには、次のようにします

def cometJson = Action {
  implicit val m                     = materializer
  def jsonSource: Source[JsValue, _] = Source(List(JsString("jsonString")))
  Ok.chunked(jsonSource.via(Comet.json("parent.cometMessage"))).as(ContentTypes.HTML)
}

§iframeでCometを使用する

Cometヘルパーは通常、次のようなHTMLページでforever-iframeテクニックで使用されます

<script type="text/javascript">
  var cometMessage = function(event) {
    console.log('Received event: ' + event)
  }
</script>

<iframe src="/comet"></iframe>

:上記のCometを動作させるには、application.confに次の設定を追加し、ルートマッピングが設定されていることを確認してください。

play.filters.headers {
  frameOptions = "SAMEORIGIN"
  contentSecurityPolicy = "connect-src 'self'"
}

Cometヘルパーの例については、Play Streaming Exampleを参照してください。

§Cometのデバッグ

動作しないCometストリームをデバッグする最も簡単な方法は、log()操作を使用して、ストリームを介したデータのマッピングに関連するエラーを表示することです。

次:WebSocket


このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインをお読みいただいた後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。