我是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),但我不明白如何以这种方式链接指令。
如果我误解了某些内容,请帮助澄清!感谢
答案 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)
}