Scala 使用路由外指令的akka http
我使用的是Scala v2.13.1和AKKA HTTP v10.1.11 我有一条如下结构的路线: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) {
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")
}
}