Scala и Akka HTTP: как получить содержимое объекта в виде строки - PullRequest
0 голосов
/ 08 апреля 2020

Я очень новичок в Akka HTTP, поэтому, пожалуйста, заранее примите мои извинения за очень элементарный вопрос.

В следующем фрагменте кода я хочу получить сущность из запроса HTTP (сущность будет простой text), получите текст из сущности и верните его в качестве ответа.

  implicit val system = ActorSystem("ActorSystem")
  implicit val materializer = ActorMaterializer
  import system.dispatcher

  val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].map {
    case HttpRequest(HttpMethods.POST, Uri.Path("/api"), _, entity, _) =>
      val entityAsText = ... // <- get entity content as text

      HttpResponse(
        StatusCodes.OK,
        entity = HttpEntity(
          ContentTypes.`text/plain(UTF-8)`,
          entityAsText
        )
      )
  }

  Http().bindAndHandle(requestHandler, "localhost", 8080)  

Как получить строковое содержимое сущности?

Заранее большое спасибо!

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Одним из подходов является вызов toStrict для RequestEntity, который загружает объект в память, и mapAsync для Flow:

import scala.concurrent.duration._

val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].mapAsync(1) {
  case HttpRequest(HttpMethods.GET, Uri.Path("/api"), _, entity, _) =>
    val entityAsText: Future[String] = entity.toStrict(1 second).map(_.data.utf8String)

    entityAsText.map { text =>
      HttpResponse(
        StatusCodes.OK,
        entity = HttpEntity(
          ContentTypes.`text/plain(UTF-8)`,
          text
        )
      )
    }
}

Отрегулируйте время ожидания для первого и уровень параллелизма на последнем.

1 голос
/ 08 апреля 2020

Другой подход заключается в использовании уже имеющегося Unmarshaller, который находится в области действия (скорее всего, это будет akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers#stringUnmarshaller):

val entityAsText: Future[String] = Unmarshal(entity).to[String]

Этот подход обеспечивает согласованное использование предоставленного Unmarshaller для String и вам не придется справляться с таймаутами.

...