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