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]
的别名)。
你想要做的是将 Directive
s 转换为其他Directive
s,为此你应该使用map
/flatMap
函数。示例如下:
def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") flatMap {
case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value))
case _ => pass
}
更多信息here。
我正在尝试嵌套现有的 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]
的别名)。
你想要做的是将 Directive
s 转换为其他Directive
s,为此你应该使用map
/flatMap
函数。示例如下:
def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") flatMap {
case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value))
case _ => pass
}
更多信息here。