Захватить все сегменты пути в 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)
            ))
          )
        )
    
Другие вопросы по тегам