akka http 自定义嵌套指令

akka http custom nested directives

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

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

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

Expression of type Directive0 doesn't conform to expected type 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))

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

您所做的实际上是通过嵌套来应用 Directive,就像您构建 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