注意
akka将Http请求中的实体(entity)实现为Source[ByteString,_]
类型,这是因为HttpRequest实体可能具有无限长度。因此,您最好确保您的应用程序具有足够的RAM来处理任何可能出现的请求...
toStrict
您可以使用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 的实体(即 "body"):
val getBodySource : HttpRequest => Source[ByteString,_] =
_.entity
.dataBytes
源可以被发送到一个汇点,该汇点将 ByteString
值收集到一个 Seq
中:
val convertSrcToSeq : Source[ByteString,_] => Future[Seq[ByteString]] =
_ runWith Sink.seq
您要查找的实体是一个连续的字符串,因此这些字节字符串需要被缩减为单个值:
val reduceSeqToStr : Future[Seq[ByteString]] => Future[ByteString] =
_ map (_ reduceOption (_ ++ _) getOrElse ByteString.empty)
现在可以将这些步骤组合成一个单一的函数:
val getBodyStrFromRequest : HttpRequest => Future[ByteString] =
getBodySource andThen convertSrcToSeq andThen reduceSeqToStr
getBodySource
函数来限制处理的 ByteString 值的数量,或者创建一个略微复杂一些的Source[ByteString, _]
来限制请求体中字符的数量... - Ramón J Romero y Vigil