【问题标题】:akka http custom nested directivesakka http 自定义嵌套指令
【发布时间】:2017-01-30 21:13:30
【问题描述】:

我正在尝试嵌套现有的 akka http(版本 10)指令来创建我自己的自定义指令。我遇到了这样的问题:

def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") {
    case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value))
    case _ => pass
}

匹配返回的类型是Directive0,但我从IDEA得到这个错误

Directive0 类型的表达式不符合预期的 Route 类型

以及来自编译器的这个错误

type mismatch;
[error]  found   : akka.http.scaladsl.server.Directive0
[error]     (which expands to)  akka.http.scaladsl.server.Directive[Unit]
[error]  required: akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult]
[error]     case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value))

是否可以以这种样式创建自定义指令(嵌套),如果可以,我做错了什么?

【问题讨论】:

    标签: scala akka-http


    【解决方案1】:

    您所做的实际上是通过嵌套它们来应用Directives,就像您将做的那样形成您的Route。事实上,最终的嵌套级别是 Route(根据 SBT 的投诉,这是 RequestContext ⇒ Future[RouteResult] 的别名)。

    您要做的是将Directives转换为其他Directives,为此您应该使用map/flatMap 函数。下面的例子:

      def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") flatMap {
        case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value))
        case _ => pass
      }
    

    更多信息here

    【讨论】:

    • 啊,非常感谢。由于某种原因,我之前读过该页面,但不知何故完全错过了 flatMap
    • 现在这个方法好像因为某种原因叫做tflatMap
    猜你喜欢
    • 2016-03-28
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    相关资源
    最近更新 更多