加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何匹配Akka HTTP中的所有路径

发布时间:2020-12-16 18:53:30 所属栏目:安全 来源:网络整理
导读:大多数Akka HTTP示例显示使用路径定义路由非常容易. 我有以下(略微简化)来自introductory example, val route = path("hello") { complete( HttpEntity( ContentTypes.`text/html(UTF-8)`,"h1Say hello to akka-http/h1")) } 但是,上面只适用于“/ hello”,
大多数Akka HTTP示例显示使用路径定义路由非常容易.

我有以下(略微简化)来自introductory example,

val route =
  path("hello") {
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,"<h1>Say hello to akka-http</h1>"))
  }

但是,上面只适用于“/ hello”,我想匹配所有可能的路径或URL,而不仅仅是“你好”.空字符串“”仅匹配根路径,“*”匹配文字路径“/ *”.路径的参数是必需的,不能简单地省略.

解决方法

有很多方法可以实现.我相信以下显示了一些最优先选择的方式.

使用其他类型的指令

最简单的解决方案需要知道路由可以是任何Directive,而不仅仅是path directives.
因此,可以通过完全删除路径来修改原始示例以实现所需的结果:

val route =
  complete(
    HttpEntity(
      ContentTypes.`text/html(UTF-8)`,"<h1>Say hello to akka-http</h1>"))

使用带路径的其他PathMatcher

path实际上并不将String作为参数. path(“hello”)实际上是隐式转换后的pathPrefix(_segmentStringToPathMatcher(“hello”)).使用PathMatcher类型的不同参数可以获得所需的结果.

您可以使用剩余的剩余部分.

val route =
  path(Remaining) { _ =>
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,"<h1>Say hello to akka-http</h1>"))
  }

或者您可以使用正则表达式:

val route =
  path(".*".r) { _ =>
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,"<h1>Say hello to akka-http</h1>"))
  }

以上两个都使匹配成为可能,因此您有另外忽略的lambda参数.

使用pathPrefix(“”)而不是路径(“”)

根据the documentation for path空字符串,“”,表现得像一个通配符,总是匹配一个字符串.但是,path需要完全匹配(匹配消耗整个字符串),但空字符串只完全消耗空字符串.由于pathPrefix只需要匹配字符串的开头,而不是消耗整个字符串,因此以下工作原理:

val route =
  pathPrefix("") {
    complete(
      HttpEntity(
        ContentTypes.`text/html(UTF-8)`,"<h1>Say hello to akka-http</h1>"))
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读