§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()
操作を使用して、ストリームを介したデータのマッピングに関連するエラーを表示することです。
このドキュメントに誤りを見つけましたか? このページのソースコードはこちらにあります。ドキュメントガイドラインをお読みいただいた後、プルリクエストを送信してください。質問やアドバイスがあれば、コミュニティフォーラムにアクセスして、コミュニティとの会話を開始してください。