Соответствие пути HTTP Akka - pathEndOrSingleSlash не соответствует

Конечная точка должна отражать часть пути запроса. Есть два варианта запроса:

<host>/xyz-<token>/
<host>/xyz-<token>.txt

token часть - это то, что я хотел бы извлечь. Однако мне подходит только второй вариант, а не первый. Запрос отклоняется с 'The requested resource could not be found'Слэш, кажется, мешает сопоставлению. Когда я удаляю косую черту из первого варианта, она совпадает, когда я добавляю косую черту ко второму, она перестает совпадать. Я перепробовал несколько вариантов, самый простой из которых:

val tokenRoute: Route = pathSuffix(s"xyz-(.+)".r) { token: String => pathEndOrSingleSlash { complete(token.split('.').head) } }

Добавление или удаление косой черты в конце регулярного выражения, похоже, не имеет никакого эффекта. Удаление pathEndOrSingleSlash Директива нет.

Что я тут недопонимаю?

РЕДАКТИРОВАТЬ:

Я был упрощен - совпавший путь должен также включать

<host>/<prefix>/xyz-<token>/
<host>/<prefix>/xyz-<token>.txt

который pathPrefix не обрабатывает - запросы, включая префикс, например <host>/abc/xyz-<token>/ отклонены с 'The requested resource could not be found',

Я хочу просто игнорировать префикс, просто перехватить токен, поступающий на любой путь.

1 ответ

Я думаю, что вы хотели использовать pathPrefix вместо pathSuffix, Если вы измените свой маршрут, чтобы он выглядел как следующий код, я думаю, у вас все заработает:

pathPrefix(s"xyz-(.+)".r) { token: String =>
  pathEndOrSingleSlash {
    complete(token.split('.').head)
  }
}

РЕДАКТИРОВАТЬ

Мой оригинальный ответ не касается случая, упомянутого в редактировании ОП. Если может быть изменчивость в ведущих элементах пути, которые должны быть сопоставлены, то лучше начинать работу с заднего конца пути, а не с фронта, что приводит к использованию pathSuffix, Вот как можно использовать сопоставление на основе суффикса, включая некоторые тестовые сценарии, чтобы показать, какие типы путей обрабатываются правильно:

  val route:Route =
    pathSuffix(Slash.?){
      pathSuffix(s"xyz-(.+)".r) { token: String =>          
        complete(token.split('.').head)         
      }
    }

  "A request to my route" should{
    "handle the route ending with a dot extension and no trailing slash" in {
      Get("/xyz-foo.txt") ~> route ~> check{
        handled ==== true
        responseAs[String] ==== "foo"
      }      
    }    
    "handle the route with no dot extension and having a trailing slash" in {
      Get("/xyz-foo/") ~> route ~> check{
        handled ==== true
        responseAs[String] ==== "foo"
      }      
    }
    "handle a number of prefix elements in the path and end in a single slash" in {
      Get("/hello/world/xyz-foo/") ~> route ~> check{
        handled ==== true
        responseAs[String] ==== "foo"
      }      
    }
    "handle a number of prefix elements in the path and end with a dot extension" in {
      Get("/hello/world/xyz-foo.txt") ~> route ~> check{
        handled ==== true
        responseAs[String] ==== "foo"
      }      
    }    
  }
Другие вопросы по тегам