将WS调用转换为任何枚举器

时间:2013-08-21 10:44:17

标签: playframework-2.1

是否有一种简洁的方法来转换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(_)))

0 个答案:

没有答案