scala - 如何获取 akka.http.scaladsl.model.HttpRequest 主体?

标签 scala akka-http

我正在使用 akka-http 并为我的一个类(class)编写一个 Unmarhsaller。我想要做的是将 POST 请求的主体作为 String 获取,这样我就可以用它创建我的对象:

case class MyClass(geom: String)

implicit def fromRequestUnmarshaller = Unmarshaller[HttpRequest, MyClass]({implicit ec: ExecutionContext =>
    req: HttpRequest => Future(MyClass(req.entity.asInstanceOf[HttpEntity.Strict].data.map(_.toChar).mkString))
})

这似乎是一行非常复杂的代码,只是为了将正文获取为String。另外,我正在做一个非常丑陋的 asInstanceOf[HttpEntity.Strict] 只是因为我在调试时认为 HttpRequest 是这种类型。

我的问题:是否有更简单/更清晰的方法来实现我的目标?

非常感谢:)

最佳答案

小心

akka 将实体实现为 Source[ByteString,_] 的原因是因为 HttpRequest 的实体可能是无限长的。因此,您最好确保您的应用程序有足够的 RAM 来处理可能向其抛出的任何请求...

严格

您可以使用 HttpEntity#toStrict :

implicit val materializer : Materializer = ???
implicit val executionContext : ExecutionContext = ???    

val entityFromRequest : (HttpRequest, FiniteDuration) => Future[ByteString] = 
  (_ : HttpRequest)
    .entity 
    .toStrict(_ : FiniteDuration)
    .map(_.data)

手动转换

您可以访问作为 Source[ByteString, _] 的 HttpRequest 的“主体”,即实体:

val getBodySource : HttpRequest => Source[ByteString,_] = 
  _.entity
   .dataBytes

这个 Source 然后可以被发送到一个 Sink,它将 ByteString 值收集到一个 Seq 中:

val convertSrcToSeq : Source[ByteString,_] => Future[Seq[ByteString]] = 
  _ runWith Sink.seq

您要查找的正文是一个连续的 String 因此这些 ByteString 需要缩减为单个值:

val reduceSeqToStr : Future[Seq[ByteString]] => Future[ByteString] = 
  _ map (_ reduceOption (_ ++ _) getOrElse ByteString.empty)

现在可以将这些步骤组合成一个函数:

val getBodyStrFromRequest : HttpRequest => Future[ByteString] = 
  getBodySource andThen convertSrcToSeq andThen reduceSeqToStr

关于scala - 如何获取 akka.http.scaladsl.model.HttpRequest 主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42861564/

相关文章:

java - 从 1.0 迁移到 2.0 时,HttpEntity 出现 `application/xml` 错误

Scala-当外部进程退出时获取回调

scala - 在 Map 对象上应用方法?

java - Thrift 异常中的异常消息是如何工作的?

netty - Akka HTTP 和 Netty 的区别

scala - Akka HTTP 2.0 使用 SSL (HTTPS)

scala - 阿卡流 : How do I get Materialized Sink output from GraphDSL API?

Scala 集合 : totally unpredictable behaviours

scala - Akka 流保持空闲状态而不是抛出异常

java - 使用 Akka http 处理 HttpResponse 404 上的重试逻辑