指令在 Spray 中如何工作?

2024-03-11

我想了解 Spray 中的指令如何工作。根据文档 http://spray.io/documentation/1.1-SNAPSHOT/spray-routing/key-concepts/directives/:

指令的一般结构如下:

name(arguments) { extractions =>
  ... // inner Route
}

我的基本理解是,在下面的代码片段中,32作为参数传递给方法test.

test {
  32
}

然而,在上述指令中name例如,据说参数被传递到内部路由,这是一个匿名函数。

有人可以帮助我理解语法和流程,从如何提取参数并将其传递到内部路由开始吗?


你是对的,该语法通过了32到函数test。你缺少的是Directive 接受函数作为参数(记住,我们现在正在进行函数式编程,所以函数就是值)。如果你想写这个:

path(IntNumber) {
  userId =>
    complete(s"Hello user $userId")
}

以一种不太 DSL 的方式,你可以这样做:

val innerFunction: Int => Route = {userId => complete(s"Hello user $userId")}
(path(IntNumber))(innerFunction)

甚至这个:

def innerMethod(userId: Int): Route = complete(s"Hello user $userId")
(path(IntNumber))(innerMethod)

实际上实现这一点的机制是……复杂的;这个方法使得Directive隐式转换为函数:

implicit def pimpApply[L <: HList](directive: Directive[L])(implicit hac: ApplyConverter[L]): hac.In ⇒ Route = f ⇒ directive.happly(hac(f))

这是使用“磁铁模式”来选择合适的hac,这样如果指令提取参数,它可以采用内部路径中的函数(具有适当数量的参数),或者如果指令不提取参数,则可以采用内部路径(普通路由)中的值。代码看起来比实际更复杂,因为 scala 不直接支持完全依赖类型,所以我们必须通过隐式来模拟它。看ApplyConverterInstances对于可怕的代码,这需要:/。

当我们获得实际路线时,实际的提取就会发生,在happly具体指令的方法。 (如果一切都使用HList在任何地方,我们基本上都可以避免/忽略前面的恐怖)。大多数提取指令(例如path)最终调用hextract:

def hextract[L <: HList](f: RequestContext ⇒ L): Directive[L] = new Directive[L] {
  def happly(inner: L ⇒ Route) = ctx ⇒ inner(f(ctx))(ctx)
}

记住一个Route真的只是一个RequestContext => Unit,所以这会返回一个Route那,当通过一个RequestContext:

  1. Runs f在其上,提取需要提取的内容(例如 URL 路径组件)
  2. Runs inner on that; inner是一个函数,例如内部路由的路径组件。
  3. 在上下文中运行该内部路由。

(以下内容是由模组从评论对话中编辑的):

从根本上来说,它非常优雅,而且很高兴您可以看到所有的喷雾代码,而且它是普通的 scala 代码(我真的建议您在感到困惑时阅读源代码)。但“桥接”部分ApplyConverter很复杂,而且确实没有办法解决;它来自于尝试用一种并非真正为它们设计的语言来执行完全依赖类型。

你必须记住,喷射路由 DSL 是一种 DSL;它是一种 DSL。这是一种几乎任何其他语言都必须作为外部配置文件的东西。我想不出有哪个 Web 框架能够在路由定义方面提供与 Spray 相同的灵活性,并具有完整的编译时类型安全性。所以,是的,喷雾所做的一些事情很复杂 - 但正如引言所说,简单的事情应该是简单的,困难的事情应该是可能的。所有 scala 级别的事情都很简单; Spray 很复杂,但用另一种语言会更复杂(无法使用)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指令在 Spray 中如何工作? 的相关文章

随机推荐

  • 使用有限的数据寻找多边形的中心

    我正在实施 Voronoi 曲面细分 然后进行平滑 为了平滑 我打算做劳埃德松弛 但我遇到了一个问题 我使用以下模块来计算 Voronoi 边 https bitbucket org mozman geoalg src 5bbd46fa22
  • NHibernate 异常:无法初始化集合,列名无效。流畅的映射。也许是多对一的问题?

    我对通过 NHibernate 遇到的异常感到困惑和沮丧 对于这篇文章的篇幅 我深表歉意 但我已尝试提供适当的详细信息来充分解释该问题 以获得一些帮助 事实如下 我有一个Person包含属性的类BillingManager 这也是一个Per
  • 是否有用于阻塞 boost::asio TCP 连接的 boost::iostreams (双向)设备?

    我正在调查可移植的 C 库 阻止对文件系统和网络的 I O 访问 它looks like boost filesystem boost iostreams and boost asio将由他们三人共同完成这项工作 需要明确的是 我目前对异步
  • 在 Winforms (C#) 中使用 MVP 模式的后台工作程序

    我一直在尝试使用 MVP 模式重构应用程序的意大利面条代码 但现在我正在为此苦苦挣扎 具有调用 DoWork 方法 后台工作者 的按钮的表单 这是一个很长的操作 我的问题是 如果我将长操作从视图移到演示器中 那么如何将此操作的进度更改发送到
  • 在线更新C#程序

    问候 如果这个问题已经被问过 我很抱歉 我尝试过使用搜索功能 但找不到适合我情况的答案 我有一个真正简单的 C 表单应用程序 只有 1 个文件 一个 exe 我目前通过 4shared 分发了此内容 人们可以随意下载 然而 每次我对程序进行
  • Matplotlib 颜色图 – 为每个图形/线条/主题选择不同的颜色

    我创建了一个读取并绘制 txt 文件及其内容 数字 值 的脚本 每个 txt 文件位于不同的文件夹中 每个文件夹又代表数据来源的一个主题 这段代码工作正常 Python 读取每个 txt 文件并将 23 个单独的图形 线条绘制成一个图 Py
  • jQuery 验证代码如何工作

    我发现这个教程使用 jQuery 和验证插件来验证表单输入 请参阅此处的工作示例 http jsfiddle net nK7Pw http jsfiddle net nK7Pw 这似乎工作正常 但是我有一个问题 在html部分中 没有提到错
  • Rails 4 更新嵌套属性

    更新嵌套属性附加而不是更新有很多关系 我正在尝试使用 Rails 4 Update attributes Class Person
  • Xamarin 表单 MessagingCenter 取消订阅未按预期工作

    当我在应用程序中多次来回导航时 MessagingCenter Subscribe 内编写的功能会被多次调用 但每次在订阅之前 我都会在构造函数中取消订阅 如下所示 但它仍然不起作用 MessagingCenter Unsubscribe
  • 提交表单后JQuery发送post请求?

    你好朋友 这是我的代码 用于表单提交 然后发送帖子链接 但表单提交成功 然后不发送帖子链接 document getElementById pitch image path form submit function e post submi
  • 应替换现有类型,添加新类型

    我有一个基地std vector和一个std initializer list
  • C编码:只读取带小数的浮点数,拒绝整数和特殊字符

    我正在尝试用 C gcc 编写代码以仅接受带小数的浮点数并拒绝整数 特殊字符 字母数字条目 有效条目是 1 23 3 45 6 77 无效条目 abc e34 834ww 6 9 还有一些不是浮动的废话 这是我尝试过的 include
  • 如何获取 Rails 控制器中活动存储中存储的附件的 URL

    如何获取存储在 Rails 控制器的活动存储中的 has one 模型附件的 URL 因此 我可以将其作为完整链接作为 json 中的 api 发送 到目前为止 我已经尝试过以下方法 但每个方法都给出了不同的问题 current user
  • 组合两个 matplotlib 颜色图

    我想将两个颜色图合并为一个 这样我就可以使用一个cmap一个用于负值 另一个用于正值 目前 我使用屏蔽数组来完成此操作 并用一张图像绘制一张图像cmap以及另一个图像与另一个图像 结果是 有以下数据 dat np random rand 1
  • 使用 Clearcase 递归签入

    我想将一个目录和所有子目录签入到透明案例中 有具体的命令可以实现吗 目前我正在进入每个目录并手动检查每个文件 我会推荐这个问题 https stackoverflow com questions 33577 how do i perform
  • 如何在 JavaScript 中循环遍历 JSON 关联数组?

    我从服务器收到 JSON 响应 并且必须在 javascript 中循环遍历数组并获取值 但我似乎无法循环遍历它 数组的 JSON 响应如下所示 1 Schools 20 Profiles 31 Statistics 44 Messages
  • 在 Facelet 模板中包含非 Facelet 内容

    有没有办法将 html 文件的内容插入到 Facelet 模板中 Facelets 标签不起作用 因为它仅用于包含 Facelet 内容 换句话说 我正在寻找相当于 JSP include 指令的 Facelets 我可能不明白你需要什么
  • 如何等待一组异步回调函数?

    我的代码在 javascript 中看起来像这样 forloop async call returns an array to its callback 所有这些异步调用完成后 我想计算所有数组的最小值 我怎样才能等到他们所有人呢 我现在唯
  • TFS 电子邮件通知

    当我在 TFS 中添加错误 工作项 并将其分配给用户时 我希望向该用户发送一封电子邮件 此外 如果现有错误的 分配给 发生更改 我希望该用户收到一封电子邮件 当用户在 TFS 2008 中分配了更改的错误时 是否可以向用户发送警报 至少在
  • 指令在 Spray 中如何工作?

    我想了解 Spray 中的指令如何工作 根据文档 http spray io documentation 1 1 SNAPSHOT spray routing key concepts directives 指令的一般结构如下 name a