我正在尝试使用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。
答案 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)
))
)
)