【问题标题】:akka http using directives outside routeakka http 在路由外使用指令
【发布时间】:2020-05-18 14:54:37
【问题描述】:

我正在使用 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】:

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

    【讨论】:

    • 非常感谢!您可能得到了一个简短的解释,为什么这里需要 flatMap
    • 基本上,指令通常通过调用tapplyapply 来生成路由。但是,如果您想创建另一个指令,您还没有最终路由。在这种情况下,flatMap 是将指令组合成另一个指令的正确运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多