akka http使用路由之外的指令

问题描述 投票:1回答:1

我使用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")
            }
        }
    }

我有如下方法 foobar 接收一些参数,执行一些逻辑,然后返回 Directive1[String].

我想用 foobar 并将它们放在一起使用(在当前路由中以相同的逻辑顺序),所以我这样做了。

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?

scala rest akka akka-http
1个回答
3
投票

使用以下结构: def foo(a: String: Directive1[String]= { provide(a) } def bar(a: String: Directive1[String] = { ... 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")
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.