akka http 在路由外使用指令
akka http using directives outside route
我正在使用 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
这样的方法,它们接收一些参数,执行一些逻辑,并且 return 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
:
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")
}
}
我正在使用 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
这样的方法,它们接收一些参数,执行一些逻辑,并且 return 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
:
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")
}
}