Akka-http - 写入响应输出流

时间:2018-01-29 14:25:00

标签: scala akka-http

我需要创建一个大的制表符分隔文件作为对HTTP GET请求的响应。 在我的路线中创建一些Scala对象,然后我想将这些对象的一些自定义表示写入输出流。

这不仅仅是以tab分隔而不是JSON的序列化,因为我还需要创建一个带有列名的标题,所以恕我直言,这不能通过自定义编组来解决。

那么如何从HttpRequest获取编写器或输出流?

这样的东西
 ~path("export") {
        get {
              val sampleExonRPKMs = exonRPKMService.getRPKMs(samples)
              val writer = HttpResponse().getWriter // this does not exists
              writeHeader(writer)
              ... // write objects tab separated
        }
   }

1 个答案:

答案 0 :(得分:1)

您可以使用可编组源完成Akka HTTP路由。如果您不想使用自定义marshallers,则可以随时使用Source[ByteString, _]完成。有关详细信息,请参阅docs

您的路线看起来像

get {
  val sampleExonRPKMs = exonRPKMService.getRPKMs(samples)
  val headers: String = ???
  Source.single(headers).concat(Source(sampleExonRPKMs).map(_.toTSVLine)).intersperse("\n").map(ByteString.apply)
}

请注意一个单独的问题:如果您正在处理大量数据,getRPKMs调用将导致将所有数据加载到内存中。