Scala 使用路由外指令的akka http

Scala 使用路由外指令的akka http,scala,rest,akka,akka-http,Scala,Rest,Akka,Akka Http,我使用的是Scala v2.13.1和AKKA HTTP v10.1.11 我有一条如下结构的路线: def foo(a: String): Directive1[String] = { provide(a) } def bar(a: String): Directive1[String] = { provide(a) } val route: Route = get { foo("a") { v => bar(v) {

我使用的是Scala v2.13.1和AKKA HTTP v10.1.11

我有一条如下结构的路线:

def foo(a: String): Directive1[String] = {
    provide(a)
}

def bar(a: String): Directive1[String] = {
    provide(a)
}

val route: Route =
    get {
        foo("a") { v =>
            bar(v) { v2 =>
                complete(s"Received: $v2")
            }
        }
    }
我有像foo和bar这样的方法,它们接收一些参数,执行一些逻辑,并返回Directive1[String]

我想在路由之外使用foo和bar,并在当前路由中以相同的逻辑顺序一起使用它们,所以我做到了:

def foobar(a: String): Directive1[String] = {
    foo(a) { v =>
        bar(v) { v2 =>
            provide(v2)
        }
    }
}

val route: Route =
    get {
        foobar("a") { v =>
                complete(s"Received: $v")
        }
    } 
我也期待着同样的结果

不幸的是,foobar不起作用,我似乎不明白为什么

错误:

type mismatch;
 found   : akka.http.scaladsl.server.Directive1[String]
    (which expands to)  akka.http.scaladsl.server.Directive[(String,)]
 required: akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult]
                provide(v2)
如何获得foobar的行为?

使用:

使用:


太棒了,谢谢!您可能得到了一个简短的解释,为什么这里需要flatMap?基本上,指令通常用于通过调用tapply或apply来生成路线。但是,如果要创建另一个指令,则还没有最终路由。在这种情况下,flatMap是将指令组合成另一个指令的正确操作符。非常感谢!您可能得到了一个简短的解释,为什么这里需要flatMap?基本上,指令通常用于通过调用tapply或apply来生成路线。但是,如果要创建另一个指令,则还没有最终路由。在这种情况下,flatMap是将指令组合到另一个指令中的正确操作符。
def foo(a: String): Directive1[String] = {
  provide(a)
}

def bar(a: String): Directive1[String] = {
  provide(a)
}

def foobar(a: String): Directive1[String] = {
  foo(a).flatMap(v => bar(v))
}

val route: Route =
  get {
    foobar("a") { v =>
      complete(s"Received: $v")
    }
  }