спрей-маршрутизация основана на концепции Directive
. .
Вы можете думать о Directive
как о преобразовании HTTP-запроса.
Мощность, связанная с директивой, — это количество аргументов, которые передаются по цепочке преобразования после выполнения преобразования.
Directive0
— это директива, которая не предоставляет (или не извлекает) никаких аргументов.
Directive1[A]
предоставляет один аргумент типа A
.
Directive[A :: B :: HNil]
предоставляет 2 аргумента типов A
и B
, или, если быть более точным, предоставляет гетерогенный список, состоящий из A
и B
(реализация представляет собой shapeless HList
).
Давайте рассмотрим примеры в вашем коде
val twoIntParameters: Directive[Int :: Int :: HNil] =
parameters('a.as[Int], 'b.as[Int])
Вы определяете новую директиву, которая извлекает два целых числа из HTTP-запроса, то есть имеет тип Directive[Int :: Int :: HNil]
. Реализация просто использует директиву, уже предоставленную спреем, то есть parameters
. parameters
— это директива, которая позволяет извлекать параметры запроса из HTTP-запроса и преобразовывать их в определенный тип, в данном случае Int
для обоих параметров.
val myDirective: Directive1[String] =
twoIntParameters.hmap {
case a :: b :: HNil => (a + b).toString
}
myDirective
— это директива, которая извлекает один параметр типа String
.
Его реализация использует ранее определенную директиву twoIntParameters
и сопоставляет ее результат, применяя к нему преобразование. В этом случае мы берем два Int
, суммируем их и превращаем результат в String
.
Итак, что с hmap
? Это просто способ, предоставляемый брызгами работы с директивами, которые возвращают бесформенное HList
. hmap
требуется функция, которая HList
ни к чему, в данном случае String
.
HList
s могут быть сопоставлены с шаблоном, как обычный scala List
, и это то, что вы видите в примере.
Наконец, это просто идея того, как директивы работают с функциональной точки зрения. Если вы хотите разобраться в тонкостях синтаксиса DSL, вам придется копнуть немного глубже и прочитать о Магнитный шаблон.
person
Gabriele Petronella
schedule
16.09.2015