2

是否有一种干净的方法可以将 HTTP GET 调用(使用 WS API)转换为流式传输(可能永远)JsObjects 到 Enumerator[JsObject]。

当然,这个枚举器必须与 WS API 很好地连接,这意味着如果 Iteratee 告诉枚举器停止发送块,枚举器将结束 WS 调用,如果 WS 完成,枚举器必须告诉它的 iteratee 他完成了.

我找到了一些丑陋的解决方案,但没有什么真正适合我的需求。

它可以类似于(伪代码):


流服务部分:

import play.api.mvc.{Action, Controller}
import play.api.libs.iteratee.{Enumeratee, Enumerator}
import play.api.libs.concurrent.Promise
import scala.util.Random
import play.api.libs.json.Json
import java.util.UUID

case class Data(id: String, payload: String)

object Application extends Controller {

  implicit val dataFmt = Json.format[Data]

  def stream = Action {
    val datas: Enumerator[Data] = Enumerator.generateM[Data] {
      Promise.timeout(
        Some(Data(UUID.randomUUID().toString, "Hello World")), Random.nextInt(500)
      )
    }
    Ok.chunked(datas.through(Enumeratee.map[Data](dataFmt.writes(_))))
  }
}

和客户端/枚举器部分:

val enumerator = WS.url("http://host:port/api/stream.json")
  .getStream() // here returns an Enumerator[Array[Byte]] for response chunks
  .through(Enumeratee.map[Array[Byte]](Json.parse(_)))
4

0 回答 0