喷涂授权指令无法按预期工作?

时间:2015-11-04 22:28:22

标签: scala spray

我对Spray很新,所以我猜这只是我没有正确理解框架是如何工作的。但是,我在尝试处理时遇到了似乎奇怪的行为。此问题专门引用this documentation on directives,但它也可能适用于其他自定义指令。

当我尝试使用Spray附带的authorize指令时,HTTP响应会根据返回的值正确显示。也就是说,当authorize的返回值为false时,我得到403 Forbidden,而当truesbt test 时,我得到200 OK。然而,似乎传递给它的函数仍然执行,即使它似乎不应该。

请参阅我创建的this SBT project来测试此内容。它完全证明了我的问题,因此,希望它有助于解决我的问题。运行:

[info] Test:
[info] route
[info] - should succeed and have side effects
[info] - should fail and not have side effects *** FAILED ***
[info]   1 did not equal 0 (Test.scala:28)
[info] Run completed in 779 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 1, canceled 0, ignored 0, pending 0
[info] *** 1 TEST FAILED ***

默认情况下您应该看到的输出应该与以下内容非常相似:

Directive0

同样,我关注的是:为什么即使请求被拒绝,函数的主体也会被传递到authorized的{​​{1}}?

(如果这是重复的道歉。我在这里其他地方找不到类似的问题,但如果你能找到一个问题,请关闭这个问题)

1 个答案:

答案 0 :(得分:1)

路由api的语义在http://spray.io/documentation/1.2.3/spray-routing/advanced-topics/understanding-dsl-structure/解释。关键点在这里是相关的:

  

将自定义逻辑放入路径结构中的错误,但是   在叶级路线之外,并期望它在执行   请求处理时间,可能是新发现的最常见的错误   喷洒用户。

参考页面中列出了两个截然不同的例子。在此示例中,println发生一次(在路径创建时):

val route: Route = get {
  println("MARK")
  complete("yeah")
}

在这个例子中,每次请求都会发生println:

val route: Route = get {
  complete {
    println("MARK")
    "yeah"
  }
}