Соответствие пути 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"
}
}
}