如何在 Akka HTTP 请求中访问请求的完整路径?

How do I access the full path of a request in Akka HTTP request?

在某些情况下,我可以使用 PathDirective 在剩余路径上进行匹配,以获取我需要的有关路径的信息。例如,当下面的route被Akka HTTP直接绑定和处理时,每个请求都会根据需要回显请求的路径。

val route =
  path(Remaining) { path =>
    complete(path)
  }

但是,当上述路由在应用程序的其他地方组合时,上面的 path 变量可能只包含请求路径的一部分,而没有给出所需的结果。

例如实际绑定的路由是,

val actualRoute = pathPrefix("echo") { route }

给用户的响应中将缺少整个路径的 "echo/" 部分。

完整路径如何可靠访问?

Directives extractMatchedPath and extractUnmatchedPath 允许您访问路径而不匹配上面的 path 指令所做的路径。这两个可以组合起来构造完整路径:

val route =
  extractMatchedPath { matched =>
    extractUnmatchedPath { unmatched =>
      complete((matched.dropChars(1) ++ unmatched).toString)
    }
  }

然而,直接从 URI 中提取 Path 可能更简洁:

val route =
  extractUri { uri =>
    complete(uri.toRelative.path.dropChars(1).toString)
  }

请注意,在这两种情况下,我们都需要调用 .dropChars(1) 来删除初始正斜杠并与使用 path 指令获得的输出一致。