如何结合常用的路径模式使用"&"在喷雾中

时间:2014-12-24 03:34:09

标签: scala spray

我正在使用喷雾来暴露周到的服务。因为在大多数服务中都有共同模式,所以我使用"&"为它创建别名。如下:

def getPath(path1: String) = path(path1) & get & detach() & complete

这段代码写在特征内部MyService使用Json4sSupport扩展HttpService,如果你试图单独编译它,你可能要写这样的

def getPath(path1: String)(implicit ec: ExecutionContext) = path(path1) & spray.routing.Directives.get & detach() & complete

并且使用它在途中很容易:

~ getPath("person2") { xxx }  
//works as
//path("person1") {
//        get {
//          detach() {
//            complete {
//              println("receiving request /person1")
//              something
//            }
//          }
//        }
//      }

但我不知道如何为帖子创建相同的别名:

path("account" / "transaction") {
        post {
          entity(as[TransferRequest]) { transferReq =>
            detach() {
              complete {
                //doing transfer
              }
            }
          }
        }
      }

我已经尝试了

def postPath[T](path1: String) = path(path1) & post & entity(as[T]) & detach() & complete

但是没有工作,没有去哪里获得" transferReq"参数。 我应该如何定义以获得我想要的东西?

1 个答案:

答案 0 :(得分:2)

complete不是一个可组合的指令,把它拿出来你就是好人。试试这个

def postPath[T](path1: String)(implicit um:FromRequestUnmarshaller[T], ec: ExecutionContext): Directive1[T] = 
    path(path1) & post & entity(as[T]) & detach(())

然后在您的通话网站中,像这样使用

import concurrent.ExecutionContext.Implicits.global

postPath[String]("123").apply { s =>
  complete (s + "abc")
}