如何使用akka-http编组一个HttpResponse的Future [Source [...]]?

时间:2017-10-04 18:31:25

标签: json scala marshalling akka-stream akka-http

我有以下方法返回Future[Source[List[String]]](CSV文件的前两行):

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

返回的Future传递给complete,它使用以下命令将其封送到JSON数组数组:

implicit val jsonStreamingSupport: JsonEntityStreamingSupport = EntityStreamingSupport.json()

但是,如果它不是200,我想检查response并返回不同的HttpResponse。看来这样做的最佳方法是整理{{1}在此方法中为Future[Source[...]],然后其返回类型为HttpResponse

我该怎么做?或者有更好的方法吗?

1 个答案:

答案 0 :(得分: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")
        }
    }