Scala akka-http 评估 headers 并在成功时继续路由?

Scala akka-http evaluate headers and continue routing if successful?

我是 scala 的新手,我正在尝试弄清楚如何添加到我们现有的路由中,以便如果命中某个路径,我们通过检查来评估 headers某些值的存在以及它们是否等于某些公认的值。如果成功,我们从 header 中获取一些 String 并将其传递,否则我们不应该继续路由并且 return 一些失败。

/abc -> don't check headers
/abc/def -> check headers, return 

pathPrefix("abc") {
  path("def") { // want to ADD something here to check headers and send it into someMethod
     get {
       complete(HttpEntity(something.someMethod(someValue)))
     }
  } ~ path("gdi") {
     get { ... etc} 
  }
}

任何想法或虚拟示例都会非常有帮助。我在这里看到一些指令从请求和 header (https://doc.akka.io/docs/akka-http/10.0.11/scala/http/routing-dsl/directives/header-directives/headerValue.html) 中获取内容,但我不明白如何以这种方式链接指令。

如果我有什么误解,请帮助澄清!谢谢

使用 headerValueByName,查找特定的 header 并在未找到 header 时拒绝请求:

get {
  headerValueByName("MyHeader") { headerVal =>
    complete(HttpEntity(something.someMethod(headerVal)))
  }
}

要验证 header 值是否存在:

get {
  headerValueByName("MyHeader") { headerVal =>
    if (isValid(headerVal)) // isValid is a custom method that you provide
      complete(HttpEntity(something.someMethod(headerVal)))
    else
      complete((BadRequest, "The MyHeader value is invalid."))
  }
}
上例中的

isValid 可能类似于:

def isValid(headerValue: String): Boolean = {
  val acceptedValues = Set("burrito", "quesadilla", "taco")
  acceptedValues.contains(headerValue.toLowerCase)
}