是否有一种简洁的方法来转换HTTP GET调用(使用WS API),该调用将(可能永远)将JsObjects流式传输到枚举器[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(_)))