我正在尝试将请求有效负载解组为字符串,但由于某种原因它失败了。我的代码:
akka.http.scaladsl.unmarshalling.PredefinedFromEntityUnmarshallers
在这个SO thread中,似乎默认情况下这个隐式应该是可用的。但也许这在akka-http中是不同的?
我尝试导入stringUnmarshaller
FromEntityUnmarshaller[String]
,但它没有帮助。也许是因为这会返回FromRequestUnmarshaller[String]
类型而不是spray.httpx.unmarshalling.BasicUnmarshallers
。 akka.http.scaladsl.unmarshalling.PredefinedFromStringUnmarshallers
中还有一个字符串unmarshaller,但这也无济于事,Blog
如何解组(和编组)成字符串?
(加分:如何直接在JsObject中解组(播放json)。但也只是字符串,因为我对它为什么不起作用感兴趣,而且对其他情况可能有用。)
使用1.0-RC3
感谢。
答案 0 :(得分:17)
如果您在范围内有正确的含义,您的代码应该没问题。如果你在范围内有一个隐式的FlowMaterializer
,那么事情应该像编译显示的代码一样正常工作:
import akka.http.scaladsl.server.Route
import akka.actor.ActorSystem
import akka.stream.ActorFlowMaterializer
import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.server.Directives._
import akka.stream.FlowMaterializer
implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()
val routes:Route = {
post{
decodeRequest{
entity(as[String]){ str =>
complete(OK, str)
}
}
}
}
如果你想更进一步并解组到JsObject
那么你只需要一个隐含的Unmarshaller
来处理转换,如下所示:
implicit val system = ActorSystem("test")
implicit val mater = ActorFlowMaterializer()
import akka.http.scaladsl.unmarshalling.Unmarshaller
import akka.http.scaladsl.model.HttpEntity
implicit val um:Unmarshaller[HttpEntity, JsObject] = {
Unmarshaller.byteStringUnmarshaller.mapWithCharset { (data, charset) =>
Json.parse(data.toArray).as[JsObject]
}
}
val routes:Route = {
post{
decodeRequest{
entity(as[String]){ str =>
complete(OK, str)
}
}
} ~
(post & path("/foo/baz") & entity(as[JsObject])){ baz =>
complete(OK, baz.toString)
}
}