如果成功,Scala akka-http 评估标头并继续路由?

Cus*_*Bun 0 scala akka akka-http

我是 Scala 的新手,我试图弄清楚如何添加到我们现有的路由中,以便如果遇到某个路径,我们会通过检查某些值是否存在以及它们是否存在来评估标头等于一些公认的值。如果成功,我们从头中取出一些 String 并将其传递,否则我们不应该继续路由并返回一些失败。

/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} 
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jef*_*ung 6

使用headerValueByName,它会查找特定标头并在找不到该标头时拒绝请求:

get {
  headerValueByName("MyHeader") { headerVal =>
    complete(HttpEntity(something.someMethod(headerVal)))
  }
}
Run Code Online (Sandbox Code Playgroud)

要验证标头值(如果存在):

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."))
  }
}
Run Code Online (Sandbox Code Playgroud)

isValid 在上面的例子中可能看起来像:

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