【问题标题】:Pre-/suffixing a Source stream in Play 2.5在 Play 2.5 中为源流添加前缀/后缀
【发布时间】:2017-12-07 19:09:17
【问题描述】:

假设我有一个使用这种方法的播放控制器 -

def persons(): Action[AnyContent] =
  Action { _ =>
    Ok.chunked(personSource.map { p => JsObject(p) }
  )
}

Akka Source 流是一个庞大但有限的 Persons 流,比如我们的 db。一次将所有内容加载到内存中会导致内存不足异常。

上面的代码运行良好,我得到了一个很长的 json 对象流:

{"name": "TestPerson1}{"name": "TestPerson2"}

但现在客户要求响应格式如下:

[{"name": "TestPerson1},{"name": "TestPerson2"}]

我在寻找如何向流中发出前缀/后缀时遇到了麻烦。也许是过滤器或嵌套动作?但是我发现的示例倾向于对请求进行操作,例如重定向,或者在将处理移交给内部 Action 之前进行一些副作用操作,例如记录某些内容。

我想在 http 响应的开头发出“[”,在中间保持 Source 异步分块处理,然后在最后发出“]”。

【问题讨论】:

  • 您可以轻松连接块的来源
  • @cchantep 啊,对了,如果我将 Person 源映射到 Source[String],然后使用 Source.concat(next),我可以在流源级别上做到这一点。谢谢,如果我让它工作,我会发布一个完整的解决方案。

标签: json scala playframework streaming akka


【解决方案1】:

感谢@cchantep 找到了解决方案

val persons = source.map { p => JsObject(p).toString }.intersperse(",")
Action { _ =>
  Ok.chunked(Source(List("[")).concat(persons).concat(Source(List("]"))))
}

甚至更简单(感谢this页面,我之前没有找到):

Ok.chunked(source.map { p => JsObject(p).toString }.intersperse("[", ",", "]") )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多