Захватить все сегменты пути в Akka/Java
Я пытаюсь захватить каждый сегмент пути URL в AkkaHTTP с Java.
Вот мой код:
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)
))
)
)
)
));
}
Итак, как вы можете видеть, я пытаюсь захватить первый сегмент пути URL и сохранить его как name
и второй сегмент пути URL и сохранить его как countryOfResidence
, Пример URL для этого будет что-то вроде
localhost:8080/users/ian/usa
Если пользователь входит только localhost:8080/users/ian
Я хочу направить к версии функции getUser() или deleteUser(), в зависимости от типа HTTP-запроса, который принимает только имя. Если пользователь вводит более длинный URL, как указано выше, я бы хотел вызвать версии getUser() или deleteUser(), которые принимают два параметра.
Всякий раз, когда я запускаю приведенный выше код, PathMatcher для имени работает отлично. Проблема возникает, когда я запускаю PathMatcher для name и countryOfResidence. Код в этих маршрутах никогда не выполняется, и сервер не возвращает JSON.
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) )) ) )