我对Spray很新,所以我猜这只是我没有正确理解框架是如何工作的。但是,我在尝试处理时遇到了似乎奇怪的行为。此问题专门引用this documentation on directives,但它也可能适用于其他自定义指令。
当我尝试使用Spray附带的authorize
指令时,HTTP响应会根据返回的值正确显示。也就是说,当authorize
的返回值为false
时,我得到403 Forbidden,而当true
为sbt 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}}?
(如果这是重复的道歉。我在这里其他地方找不到类似的问题,但如果你能找到一个问题,请关闭这个问题)
答案 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"
}
}