scala - akka http 自定义嵌套指令

标签 scala 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 得到这个错误

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] 的别名)。

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

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

更多信息 here .

关于scala - akka http 自定义嵌套指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41945498/

相关文章:

scala - 如何在 Slick 2.0 中计算 COUNT(*)?

scala - 如何在Akka HTTP中匹配所有路径

scala - Akka http客户端连接池的正确使用

scala - Akka Stream + Akka Http - 获取错误请求

scala - akka-http 发送连续分块的 http 响应(流)

tomcat - AKKA-http部署

multithreading - 回调如何在非阻塞设计中工作?

scala - def 是否被视为 Scala 中的闭包?

scala、spring 和 scalate

json - 使用 Play 2.1.1 在 JSON 中迭代和重新格式化数组