如何在单个路由中解组 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 函数中调用参数longlat,我想它们不存在于那个范围内。情况相同,反之亦然。

我希望能够访问我的参数和我的 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 中获取数据?

如何在 jax-ws 网络服务中解组 xml 文件

如何使用 spring 集成 dsl 从 JMS 队列中解组 XML

在 Unmarshal 期间处理不同类型的参数

在 PreferenceFragment 中解组时找不到类

KTOR - 在 POST 路由中解压缩文件