阅读并理解喷雾路由DSL



我是新手。我曾使用过几种奇怪的(对我来说)编程语言,如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"
}

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

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

与指令相关联的基数是在执行转换后它在转换链中传递的参数的数量。

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

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

Directive[A :: B :: HNil]提供了两个类型分别为AB的参数,或者——更准确地说——提供了一个由AB组成的异构列表(实现是一个未成形的HList)。

让我们看看代码中的例子

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

你定义了一个新的指令,从HTTP请求中提取两个整数,即具有类型Directive[Int :: Int :: HNil]。实现简单地利用了spray已经提供的指令,即parametersparameters是一个指令,允许从HTTP请求中提取查询参数并将其转换为特定类型,在本例中,Int用于两个参数。

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

myDirective是提取一个String类型参数的指令。

它的实现使用前面定义的twoIntParameters指令并映射到它的结果,对它应用一个转换。在本例中,我们取两个Int,将它们相加并将结果转化为String

那么,hmap是什么?这只是由spray提供的一种方式,使用返回无形状HList的指令。hmap需要一个函数HList to任何东西,在这里是String

HList s可以进行模式匹配,就像普通的scala List一样,这就是您在示例中看到的。

最后,这只是从函数的角度来理解指令是如何工作的。如果您想要了解DSL语法的细节,您将不得不进一步挖掘并阅读Magnet Pattern。

我在这里找到了一个非常好的工作室。

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

最新更新