2016-10-27 14 views
0

私はakka-httpの新機能です。任意の数のラインでCSVをストリーミングしたいと思います。例えばスカラーの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) 

おかげ

EDIT:ラモン・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) 

    } 
} 
私は最初の問題arroundの取得するにはタプルのリストを使用

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) 

(私はスカラ座でマップをストリーミングする方法がわからないhower) なしアイデア:このコードでは

私は2個のコンパイルエラーを持っていますsecond ご協力ありがとうございます。

(私はScalaの2.11.8を使用しています)

答えて

3

Source[ByteString,Any]にかかるHttpEntityapply機能を使用してください。 applyはChunkedエンティティを作成します。あなたは、アッカ・ストリームSourceを使用してIOファイルをストリーミングするためdocumentationに基づいてコードを使用してファイルを読むことができます:

import akka.stream.scaladsl._ 

val file = Paths.get("yourFile.csv") 

val entity = HttpEntity(`txt/csv`, FileIO.fromPath(file)) 

ストリームは、チャンクサイズにdefault is currently set to 8192をあなたのファイルを分割します。私は私のマップではなく、ファイルをストリーミングするためにこれを使用する必要がありますどのようにあなたの答えのための

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

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

おかげで、:あなたは、あなたが同様のトリックを使用することができます作成​​したマップをストリームに

? – ogen

+0

@ogen更新された応答を参照してください... –

+0

あなたの答えをありがとう、ありがとう、タイプの不一致コンパイルエラー、期待ToResponseMarshallable、実際のすべて。あなたの助けをありがとう – ogen

関連する問題