Извлечение заголовка пути в директивах Akka

Я использую директивы akka для соответствия определенному шаблону пути:

/item/quantity

Примеры были бы

/apples/100
/bananas/200

Возможные элементы (например, яблоки, бананы и т. д.) заранее неизвестны, поэтому жесткое кодирование элементов с помощью path невозможно.

Однако я не могу найти PathMatcher, который извлекает заголовок пути. Я ищу что-то в форме

val route = 
  get {
    path(PathHeadAsString) { item : String =>
      path(IntNumber) { qty : Int =>
        complete(s"item: $item quantity: $qty")
      } ~ complete("no quantity specified")
    } ~ complete("no item specified")
  }

Где

Get("/apples/100") ~> route ~> check {
  responseAs[String] shouldEqual "item: apples quantity: 100"
}

Есть ли способ извлечь первый сегмент пути?

Сопоставитель path(segment) не будет соответствовать, если количество находится в пути.

Я, очевидно, мог бы использовать path(segments) для получения List[String] элементов пути, но тогда мне пришлось бы вручную извлекать начало и конец списка, что кажется неэлегантным.

Заранее благодарю за внимание и ответ.


person Ramón J Romero y Vigil    schedule 18.01.2016    source источник
comment
Как примечание, вы можете быть полностью осведомлены: вы, вероятно, захотите, чтобы соответствующие директивы соответствовали методам http: get, post, put и тд..   -  person Richard Sitze    schedule 19.01.2016
comment
@RichardSitze Я соответствующим образом обновил код своего примера. Спасибо за примечание.   -  person Ramón J Romero y Vigil    schedule 19.01.2016


Ответы (1)


Вы можете составить PathMatchers с модификаторами таким образом

path(Segment / IntNumber) { case (item, qty) =>
  complete(s"item: $item quantity: $qty")
}

ИЛИ, если вам нужен полный разрыв, используйте pathPrefix:

val route = 
pathPrefix(Segment) { item : String =>
  path(IntNumber) { qty : Int =>
    complete(s"item: $item quantity: $qty")
  } ~
  pathEnd { complete("no quantity specified") } ~
  complete("something else going on here")
} ~
complete("no item specified")

(Обратите внимание на дополнительную директиву pathEnd; даже с учетом этого я бы не сказал, что сопоставленные шаблоны представляют все возможные ситуации.)

Из директив маршрутизации akka :

  • директива pathPrefix "Применяет заданный PathMatcher к префиксу оставшегося несопоставленного пути после использования ведущей косой черты."

  • директива path "Применяет заданный PathMatcher к оставшемуся несопоставленному пути после использования ведущей косой черты."

  • директива pathEnd "Проходит запрос по внутреннему маршруту только в том случае, если путь запроса полностью совпадает."

Из пути akka- сопоставители, сопоставитель пути Segment "Сопоставляется, если несопоставленный путь начинается с сегмента пути (т. е. не косой черты). В этом случае сегмент пути извлекается как экземпляр String."

person Richard Sitze    schedule 19.01.2016
comment
Почему вы делаете case (item, qty) => ..., а не только (item, qty) => ...? Почему это должна быть частичная функция? - person Anton K; 24.10.2018
comment
@AntonK мое предположение (то есть предположение) состоит в том, что Route определяет, соответствует ли pathMatcher или нет, благодаря возможности запрашивать частичную функцию, если она isDefinedAt заданный параметр(ы). - person Richard Sitze; 30.10.2018