2017-10-04 18 views
2

IはFuture[Source[List[String]]](CSVファイルの最初の二行)を返す以下の方法た:アレイのJSON配列にそれをマーシャリングakka-httpでHttpResponseに未来[ソース[...]]をマーシャリングする方法は?

def get(url: String, charset: String, delimiter: Char, quote: Char, escape: Char) = { 
    val scanner = CsvParsing.lineScanner(
     delimiter.toByte, 
     quote.toByte, 
     escape.toByte 
    ) 

    val request = HttpRequest(GET, Uri(url)).withHeaders(`User-Agent`(UserAgent)) 

    Http(system) 
     .singleRequest(request) 
     .map { response => 
      response.entity.withoutSizeLimit.dataBytes 
       .viaMat(scanner)(Keep.left) 
       .map(row => 
        row.map(bs => 
         bs.decodeString(charset) 
        ) 
       ) 
       .take(2) 
     } 
} 

ザがcompleteに渡されるFutureを返したが、使用して:

それが、この中 HttpResponseFuture[Source[...]]をマーシャリングすることですこれを行うための最善の方法のように思える200でない場合
implicit val jsonStreamingSupport: JsonEntityStreamingSupport = EntityStreamingSupport.json() 

しかし、私はresponseを検査し、異なるHttpResponseを返したいのですがメソッドの戻り値の型はどちらでもHttpResponseになります。

どうすればよいですか?それとも良い方法がありますか?

答えて

0

さて、私は別のアプローチで最後にそこに着いた。

Http(system).singleRequest(request) 
    .flatMap { response => 
     response.status match { 
      case StatusCodes.OK => 
       val compression = CompressionChooser.choose(url, gzip, response) 
       response.entity.withoutSizeLimit.dataBytes 
        .via(compression.decoder.decoderFlow) 
        .viaMat(scanner)(Keep.left) 
        .map(_.map(_.decodeString(charset))) 
        .take(2) 
        .runWith(Sink.seq) 
        .map { rows => 
         val json = Json.toJson(rows) 
         HttpResponse(
          StatusCodes.OK, 
          entity = HttpEntity(ContentTypes.`application/json`, json.toString) 
         ) 
        } 

      case _ => Future successful HttpResponse(StatusCodes.BadRequest, entity = "Error") 
     } 
    } 
関連する問題