我需要创建一个大的制表符分隔文件作为对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
}
}
答案 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
调用将导致将所有数据加载到内存中。