代码之家  ›  专栏  ›  技术社区  ›  CustardBun

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

  •  0
  • CustardBun  · 技术社区  · 6 年前

    我是scala新手,我正试图找出如何添加到现有路由中,以便在遇到某条路径时,通过检查某些值的存在以及它们是否等于某些可接受的值来评估标头。如果成功,我们将从标头中获取一些字符串并将其传递,否则我们不应该继续路由并返回一些失败。

    /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 回复  |  直到 6 年前
        1
  •  6
  •   Jeffrey Chung    6 年前

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