如何在单个路由中解组 POST 参数和 JSON 正文?
Posted
技术标签:
【中文标题】如何在单个路由中解组 POST 参数和 JSON 正文?【英文标题】:How to unmarshal POST params and JSON body in a single route? 【发布时间】:2015-02-26 18:03:56 【问题描述】:我有这条路线:
val routes =
pathPrefix("api")
path("ElevationService" / DoubleNumber / DoubleNumber) (long, lat) =>
post
requestContext =>
println(long, lat)
这很好用,我可以将我的ElevationService
称为:
http://localhost:8080/api/ElevationService/39/80
问题是,我还想将请求中发送给我的正文解析为 JSON。它看起来如下:
"first": "test",
"second": 0.50
我已经设法让它在 the documentation on the entity directive 之后的单独路径中工作:
path("test")
import scrive.actors.ScriveJsonProtocol
import spray.httpx.SprayJsonSupport._
post
entity(as[ScriveRequest]) scrive =>
complete(scrive)
但我不知道如何将这两条路线合并为一条。由于它们被包装在函数中,我不能从entity
函数中调用参数long
、lat
,我想它们不存在于那个范围内。情况相同,反之亦然。
我希望能够访问我的参数和我的 POST 正文,然后调用传递所有数据的服务:
val elevationService = actorRefFactory.actorOf(Props(new ElevationService(requestContext)))
elevationService ! ElevationService.Process(long, lat, bodyParams)
【问题讨论】:
【参考方案1】:你可以只嵌套指令:
path("ElevationService" / DoubleNumber / DoubleNumber) (long, lat) =>
post
entity(as[ScriveRequest]) scrive =>
onSuccess( elevationService ? ElevationService.Process(long, lat, bodyParams) )
actorReply =>
complete(actorReply)
您也可以使用&
更直接地组合两个指令:
(path("ElevationService" / DoubleNumber / DoubleNumber) & entity(as[ScriveRequest]))
(long, lat, scriveRequest) => ...
【讨论】:
谢谢,我会试一试,但我得到“缺少参数类型:actorReply”,显然因为它没有在任何地方定义。这个“actorReply”是对 Actor 的某种回调,还是它的用途。如果我问了愚蠢的问题,我很抱歉,我刚刚开始使用 Spray,这个 dsl 路由太混乱了。actorReply
是我用来作为演员响应的名称。我忘记了 akka 是无类型的,所以它可能需要一个演员表。如果您不需要等待参与者的响应,那么您不需要?
或onSuccess
,您可以使用!
向参与者发送即发即弃消息,然后把它留在那里。以上是关于如何在单个路由中解组 POST 参数和 JSON 正文?的主要内容,如果未能解决你的问题,请参考以下文章
在 Golang 中解组 XML 时如何在 interface 中获取数据?