Захватить все сегменты пути в Akka / Java - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь захватить каждый сегмент пути 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 Ответ

0 голосов
/ 23 мая 2018

Я думаю, что проблема в том, что директивы предпринимаются по порядку, поэтому более короткие из них будут совпадать до того, как будут испробованы более конкретные. Я предлагаю вам попробовать либо:

  • ставить сначала наиболее конкретный путь (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)
            ))
          )
        )
    
...