我有一个简单的应用程序,它会向DB提出一个问题,然后将一些数据作为简单文本返回。 ' plain / text'响应恰好是CSV格式。它被另一个程序(matlab,通过webread)读入,然后我们进行分析'。
现在,Play框架似乎已经改变了一些设置。而在此代码之前;
def singleEventsMultipleRegions(peril: String, region: List[String]) = Action.async {
val theResult = db.run(filter(peril, region).result)
val intermediate = theResult.map(result => header + result.mkString("\r\n"))
intermediate.map( item => Ok(item))
准确地回复了我想要的东西。现在,matlab在大约10000行后被切断。如果我在浏览器中查看结果,它会加载整个响应。相当令人沮丧。
可悲的是,我不明白发生了什么......有人知道吗?
其次,有人能指出我的方向......
本地人'以CSV格式动态提供数据的策略? 这样做的简单方法是让客户没有尽早完成阅读?
干杯, 西蒙
答案 0 :(得分:1)
我在这里有部分答案;
def allPerilStream = Action {
val stream = db.stream(allPerilsTable.result)
val source = Source.fromPublisher(stream.mapResult(u => u.aPeril + "\n")).map(ByteString.apply)
Ok.sendEntity(HttpEntity.Streamed(source, None, Some("")))
}
哪个几乎可以工作......除了它不包含表头。
关于如何在这样的流中插入标题的任何想法?
因此,最终结论如下。看起来可以直接从期货创建akka资源(这需要我年龄!!!!!)才能搞清楚。一旦你知道了,
def allPerilStream = Action {
val theResult = for(
result <- db.run(allPerilsTable.result)
) yield (
header +
result.mkString("\n")
)
val source = Source.fromFuture(theResult).map(ByteString.apply)
val entity = HttpEntity.Streamed(source, None, Some(""))
Ok.sendEntity(entity)
}
我希望能够做到这一点