阅读并理解喷涂路由DSL

时间:2015-09-16 12:06:28

标签: scala spray spray-routing

我是新手。 我和几个奇怪的(对我来说)编程语言一样工作,比如python,JQuery等......有了它们,我至少可以理解一些代码段的作用。 不幸的是,使用Spray,我甚至无法阅读和理解简单的代码。

有些人可以帮我阅读(用文字描述,代码做什么)以下简单的代码块。

注意:我知道非常高的级别,这将选择url参数并将它们添加到一起。但我想要的是,清楚地理解这个代码块晶体,因为我可以教别人。 HNil, Directive1, Directive1, ::对我来说有些奇怪。

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

val myDirective: Directive1[String] =
  twoIntParameters.hmap {
    case a :: b :: HNil => (a + b).toString
  }

// test `myDirective` using the testkit DSL
Get("/?a=2&b=5") ~> myDirective(x => complete(x)) ~> check {
  responseAs[String] === "7"
}

2 个答案:

答案 0 :(得分:3)

喷涂路由是围绕Directive的概念构建的。

您可以将Directive视为对HTTP请求的转换。

与指令关联的基数是在执行转换后向下传递变换链的参数数量。

Directive0是一个不提供(或提取)任何参数的指令。

Directive1[A]提供了A类型的一个参数。

Directive[A :: B :: HNil]提供了AB类型的2个参数,或者 - 更准确地说 - 提供了由AB组成的异构列表(实施是shapeless's HList)。

让我们在您的代码中采用示例

val twoIntParameters: Directive[Int :: Int :: HNil] =
  parameters('a.as[Int], 'b.as[Int])

您正在定义一个新指令,该指令从HTTP请求中提取两个整数,即类型为Directive[Int :: Int :: HNil]。 该实现简单地利用了喷雾已经提供的指令,即parametersparameters是一个指令,允许从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可以进行模式匹配,就像普通的scala List一样,这就是你在示例中看到的内容。

最后,这只是一个关于指令如何从功能的角度运作的想法。 如果您想了解DSL语法的详细信息,您将需要进一步深入了解并阅读Magnet Pattern

答案 1 :(得分:0)

我在这里找到了一个非常好的研讨会。

https://www.youtube.com/watch?v=XPuOlpWEvmw