【问题标题】:How to marshal a Future[Source[...]] to an HttpResponse with akka-http?如何使用 akka-http 将 Future[Source[...]] 编组到 HttpResponse?
【发布时间】:2018-03-16 06:13:07
【问题描述】:

我有以下方法返回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()

但是,我想检查 response 并返回不同的 HttpResponse,如果它不是 200。似乎最好的方法是将 Future[Source[...]] 编组为 @987654329 @ 在这个方法中,然后它的返回类型将是HttpResponse

我该怎么做?还是有更好的办法?

【问题讨论】:

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


    【解决方案1】:

    好的,所以我最终采用了不同的方法。

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

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2016-06-15
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多