【问题标题】:Scala akka-http evaluate headers and continue routing if successful?如果成功,Scala akka-http 评估标头并继续路由?
【发布时间】:2018-01-04 20:54:21
【问题描述】:

我是 scala 的新手,我正在尝试弄清楚如何添加到我们拥有的现有路由中,以便如果某个路径被命中,我们会通过检查某些值是否存在以及是否存在来评估标头或者它们是否等于一些公认的值。如果成功了,我们就从 headers 中获取一些 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)中获取内容的指令,但我不明白如何以这种方式链接指令。

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

【问题讨论】:

    标签: scala akka akka-http


    【解决方案1】:

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

    【讨论】:

    • 如果我们必须超越检查头部是否存在,检查它是否存在并且是否等于某个值等等,你会建议怎么做?
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多