我有以下方法返回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
。
我该怎么做?或者有更好的方法吗?
答案 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")
}
}