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

时间:2018-01-04 20:54:22

标签: 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} 
  }
}

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

如果我误解了某些内容,请帮助澄清!感谢

1 个答案:

答案 0 :(得分:3)

使用headerValueByName查找特定标头,如果找不到该标头,则拒绝该请求:

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

验证标头值是否存在:

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)
}