2017-10-04 11 views
2

나는 Future[Source[List[String]]] (CSV 파일의 처음 두 행) 반환 다음과 같은 방법이 있습니다 배열의 JSON 배열에 마샬링akka-http가있는 HttpResponse에 [Source [...]] Future를 마샬링하는 방법은 무엇입니까?

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") 
     } 
    }