捕获Akka / Java中的所有路径段

时间:2018-05-12 14:26:33

标签: java akka akka-http

我正在尝试使用Java捕获AkkaHTTP中URL路径的每个段。

这是我的代码:

public Route routes() {
    return route(pathPrefix("users", () ->
        route(
            getOrPostUsers(),
            path(PathMatchers.segment(), name -> route(
                getUser(name),
                deleteUser(name),
                path(PathMatchers.segment(), countryOfResidence -> route(
                  getUser(name, countryOfResidence),
                  deleteUser(name, countryOfResidence)
                ))
              )
            )

        )
    ));
}

因此,正如您所看到的,我正在尝试抓取网址路径的第一部分并将其存储为name和网址路径的第二部分,并将其存储为countryOfResidence。此示例的URL类似于

localhost:8080/users/ian/usa

如果用户只输入localhost:8080/users/ian,我想路由到函数getUser()或deleteUser()的版本,具体取决于只接受名称的HTTP请求的类型。如果用户输入更长的URL,如上所述,我想调用带有两个参数的getUser()或deleteUser()版本。

每当我运行上面的代码时,名称的PathMatcher完全正常。当我为name和countryOfResidence运行PathMatcher时会出现问题。这些路由中的代码永远不会运行,服务器也不会返回任何JSON。

1 个答案:

答案 0 :(得分:1)

我认为问题在于指令是按顺序尝试的,因此较短的指令会在尝试更具体的指令之前匹配。我建议你尝试:

  • 首先放置最具体的路径(path(PathMatchers.segment(), countryOfResidence ...),以便在较短路径匹配之前匹配或

  • 使用指令匹配pathEndOrSingleSlash()后缀较短的情况,以便它们明确地不匹配较长的路径:

        path(PathMatchers.segment(), name -> route(
            pathEndOrSingleSlash(() -> route(
              getUser(name),
              deleteUser(name)
            ),
            path(PathMatchers.segment(), countryOfResidence -> route(
              getUser(name, countryOfResidence),
              deleteUser(name, countryOfResidence)
            ))
          )
        )