文件

§Comet

§使用分段回應搭配 Comet

分段回應的常見用途是建立 Comet socket。

Comet socket 是一種分段的 text/html 回應,其中只包含 <script> 元素。對於每個分段,我們會撰寫一個包含 JavaScript 的 <script> 標籤,而該 JavaScript 會立即由網路瀏覽器執行。這樣一來,我們就能從伺服器傳送事件到網路瀏覽器:對於每則訊息,將其包裝到會呼叫 JavaScript 回呼函式的 <script> 標籤中,並將其寫入分段回應。

因為 Ok.chunked 利用 Pekko Streams 來取得 Flow[ByteString],所以我們可以傳送元素的 Flow,並轉換它,讓每個元素都經過跳脫處理,並包裝在 Javascript 方法中。Comet 輔助程式會自動化 Comet sockets,推播一個初始的空白緩衝資料,以符合瀏覽器相容性,並支援字串和 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 系統中提取 pekko.stream.Materializer

§搭配字串 Flow 使用 Comet

若要透過 Flow 推播字串訊息,請執行下列動作

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 Flow 使用 Comet

若要透過 Flow 推播 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 輔助程式通常應搭配 forever-iframe 技術使用,搭配類似下列的 HTML 頁面

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

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

注意:將下列設定新增至您的 application.conf,並確保您已設定路由對應,才能看到上述 Comet 的作用。

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

如需 Comet 輔助程式的範例,請參閱 Play 串流範例

§偵錯 Comet

偵錯無法運作的 Comet 串流最簡單的方法,是使用 log() 作業,以顯示串流中資料對應時所涉及的任何錯誤。

下一頁:WebSocket


在這個文件中發現錯誤?此頁面的原始程式碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提交拉取請求。有任何問題或建議要分享嗎?請前往 我們的社群論壇 與社群展開討論。