是否有一种干净的方法可以将 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(_)))