我正在尝试嵌套现有的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))
是否可以用这种风格(嵌套)创建自定义指令,如果是这样,我做错了什么?
答案 0 :(得分:4)
您正在做的主要是通过嵌套来应用Directive
,就像您要形成Route
一样。事实上,根据SBT的投诉,最终的嵌套级别需要Route
(RequestContext ⇒ Future[RouteResult]
的别名。
您要做的是将 Directive
转换为其他Directive
,为此您应该使用map
/ {{1} } 功能。示例如下:
flatMap
更多信息here。