在scala中使用akka http传输CSV

在scala中使用akka http传输CSV,scala,csv,akka,akka-http,Scala,Csv,Akka,Akka Http,我对akka http非常陌生,我想用任意行数流式传输csv 例如,我想返回: a,1 b,2 c,3 使用以下代码 implicit val actorSystem = ActorSystem("system") implicit val actorMaterializer = ActorMaterializer() val map = new mutable.HashMap[String, Int]() map.put("a", 1) map.put("b", 2) map.put("c

我对akka http非常陌生,我想用任意行数流式传输csv

例如,我想返回:

a,1
b,2
c,3
使用以下代码

implicit val actorSystem = ActorSystem("system")
implicit val actorMaterializer = ActorMaterializer()

val map = new mutable.HashMap[String, Int]()
map.put("a", 1)
map.put("b", 2)
map.put("c", 3)
val `text/csv` = ContentType(MediaTypes.`text/csv`, `UTF-8`)
val route =
  path("test") {
    complete {
      HttpEntity(`text/csv`, ??? using map)
    }
  }
Http().bindAndHandle(route,"localhost",8080)
谢谢你的帮助

编辑:感谢拉蒙·J·罗梅罗·y守夜

package test


import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpCharsets.`UTF-8`
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.stream._
import akka.util.ByteString

import scala.collection.mutable

object Test{

  def main(args: Array[String]) {

    implicit val actorSystem = ActorSystem("system")
    implicit val actorMaterializer = ActorMaterializer()

    val map = new mutable.HashMap[String, Int]()
    map.put("a", 1)
    map.put("b", 2)
    map.put("c", 3)

    val mapStream = Stream.fromIterator(() => map.toIterator)
      .map((k: String, v: Int) => s"$k,$v")
      .map(ByteString.apply)
    val `text/csv` = ContentType(MediaTypes.`text/csv`, `UTF-8`)
    val route =
      path("test") {
        complete {
          HttpEntity(`text/csv`, mapStream)
        }
      }
    Http().bindAndHandle(route, "localhost", 8080)

  }
}
使用此代码,我有两个编译错误:

Error:(29, 28) value fromIterator is not a member of object scala.collection.immutable.Stream
val mapStream = Stream.fromIterator(() => map.toIterator)

Error:(38, 11) overloaded method value apply with alternatives:
  (contentType: akka.http.scaladsl.model.ContentType,file: java.io.File,chunkSize: Int)akka.http.scaladsl.model.UniversalEntity <and>
  (contentType: akka.http.scaladsl.model.ContentType,data: akka.stream.scaladsl.Source[akka.util.ByteString,Any])akka.http.scaladsl.model.HttpEntity.Chunked <and>
  (contentType: akka.http.scaladsl.model.ContentType,data: akka.util.ByteString)akka.http.scaladsl.model.HttpEntity.Strict <and>
  (contentType: akka.http.scaladsl.model.ContentType,bytes: Array[Byte])akka.http.scaladsl.model.HttpEntity.Strict <and>
  (contentType: akka.http.scaladsl.model.ContentType.NonBinary,string: String)akka.http.scaladsl.model.HttpEntity.Strict
 cannot be applied to (akka.http.scaladsl.model.ContentType.WithCharset, List[akka.util.ByteString])
          HttpEntity(`text/csv`, mapStream)
错误:(29,28)迭代器的值不是对象scala.collection.immutable.Stream的成员
val mapStream=Stream.fromtiterator(()=>map.toIterator)
错误:(38,11)重载的方法值应用于替代项:
(contentType:akka.http.scaladsl.model.contentType,文件:java.io.file,chunkSize:Int)akka.http.scaladsl.model.UniversalEntity
(contentType:akka.http.scaladsl.model.contentType,数据:akka.stream.scaladsl.Source[akka.util.ByteString,Any])akka.http.scaladsl.model.HttpEntity.Chunked
(contentType:akka.http.scaladsl.model.contentType,数据:akka.util.ByteString)akka.http.scaladsl.model.HttpEntity.Strict
(contentType:akka.http.scaladsl.model.contentType,字节:Array[Byte])akka.http.scaladsl.model.HttpEntity.Strict
(contentType:akka.http.scaladsl.model.contentType.NonBinary,string:string)akka.http.scaladsl.model.HttpEntity.Strict
无法应用于(akka.http.scaladsl.model.ContentType.WithCharset,列表[akka.util.ByteString])
HttpEntity(`text/csv`,mapStream)
我使用了一个元组列表来绕过第一个问题(但是我不知道如何在Scala中流式处理映射) 第二个不知道 谢谢你的帮助


(我正在使用scala 2.11.8)

使用中的
apply
函数,该函数接受
源代码[ByteString,Any]
。应用程序创建一个实体。您可以使用基于akka流的流文件IO的代码读取文件:

该流将把文件分成块大小

要对已创建的地图进行流式处理,可以使用类似的技巧:

val mapStream = Source.fromIterator(() => map.toIterator)
                      .map( (k : String, v : Int) => s"$k,$v" )
                      .map(ByteString.apply)

val mapEntity = HttpEntity(`test/csv`, mapStream)

使用中的
apply
函数接收
源代码[ByteString,Any]
。应用程序创建一个实体。您可以使用基于akka流的流文件IO的代码读取文件:

该流将把文件分成块大小

要对已创建的地图进行流式处理,可以使用类似的技巧:

val mapStream = Source.fromIterator(() => map.toIterator)
                      .map( (k : String, v : Int) => s"$k,$v" )
                      .map(ByteString.apply)

val mapEntity = HttpEntity(`test/csv`, mapStream)

谢谢你的回答,我应该如何使用它来流式传输我的地图而不是文件?谢谢你的回答,但是我有一个类型不匹配的编译错误,应该是responseMarshall,实际是Any。谢谢你的帮助help@ogen如果没有完整的代码和编译器输出,我无法帮助处理编译器错误。我的答案是对你原来的问题:“我想流一个csv与任意数量的行”。我回答了那个问题…@ogen我修正了我的答案,应该是
Source.fromtiterator
而不是
Stream.fromtiterator
@ogen不客气。您可能应该更改问题以反映编译代码。愉快的黑客行为。谢谢你的回答,我应该如何使用它来流式传输我的地图而不是文件?谢谢你的回答,但我有一个类型不匹配的编译错误,应该是ResponseMarshallable,实际是Any。谢谢你的帮助help@ogen如果没有完整的代码和编译器输出,我无法帮助处理编译器错误。我的答案是对你原来的问题:“我想流一个csv与任意数量的行”。我回答了那个问题…@ogen我修正了我的答案,应该是
Source.fromtiterator
而不是
Stream.fromtiterator
@ogen不客气。您可能应该更改问题以反映编译代码。快乐黑客。