Akka HTTP 自定义嵌套指令



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

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

从匹配中返回的类型是Directive0,但我从 IDEA 收到此错误

指令 0 类型的表达式不符合预期的路由类型

以及编译器的此错误

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))

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

您正在做的本质上是通过嵌套来应用Directive,就像您形成Route一样。事实上,最终的嵌套级别期待一个Route(根据SBT的投诉,这是RequestContext ⇒ Future[RouteResult]的别名)。

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

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

更多信息在这里。

最新更新