喷:路由——理解path和pathPrefix的区别
Spray: routing - understand the difference between path and pathPrefix
import akka.actor.Actor
import spray.routing.HttpService
import spray.http._
import MediaTypes._
import spray.json._
import spray.routing.directives.CachingDirectives._
import spray.httpx.encoding._
trait MarginEvaluationService extends HttpService {
import ClassSerializer._
import spray.httpx.SprayJsonSupport._
val myRoute = {
pathPrefix("hello") {
get {
respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
}
~
pathPrefix("testjson") {
get {
entity(as[TestC]) { c =>
respondWithMediaType(`application/json`) {
complete(c)
}
}
}
}
}
}
route 被窃听:
Error:(49, 1) illegal start of simple expression
pathPrefix("testjson") { ^
path
和 pathPrefix
有什么区别?
我不确定 ~
运算符是否未正确包含。
path
是最终路径,而 pathPrefix
随后可以使用 DSL 与其他路径段组合。
如果你想完全匹配 /hello
你应该使用 path("hello")
.
pathPrefix
在
这样的情况下很方便
pathPrefix("hello") {
path("foo") {
complete("foo")
} ~
path("bar") {
complete("bar")
}
}
将匹配 /hello/foo
和 /hello/bar
.
话虽如此,我怀疑您遇到的错误只是 scala 解析器与 DSL 不兼容。
您能否尝试将 ~
移动到右括号所在的同一行?
我认为解析器正在推断一个分号,所以它真的将该段代码理解为
pathPrefix("hello") {
get {
respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
};
~
pathPrefix("testjson") {
get {
entity(as[TestC]) { c =>
respondWithMediaType(`application/json`) {
complete(c)
}
}
}
}
pathPrefix(x): 这将在不匹配的 (x) 之前添加一个斜杠。为了便于使用,我们不必在指令中包含斜杠。 (斜线 ~ x).
path(x):这会在不匹配的(x)之前加一个斜杠,会匹配(x)然后加一个PathEnd。 (x) 之后的不匹配路径将被忽略。 (斜线 ~ x ~ PathEnd)
在docs中:
path(x):相当于rawPathPrefix(slash().concat(segment(x)).concat(pathEnd()))。它匹配前导斜杠后跟 x,然后是结尾。
pathPrefix(x):相当于rawPathPrefix(slash().concat(segment(x)))。它匹配前导斜杠后跟 x,然后留下不匹配的后缀。
import akka.actor.Actor
import spray.routing.HttpService
import spray.http._
import MediaTypes._
import spray.json._
import spray.routing.directives.CachingDirectives._
import spray.httpx.encoding._
trait MarginEvaluationService extends HttpService {
import ClassSerializer._
import spray.httpx.SprayJsonSupport._
val myRoute = {
pathPrefix("hello") {
get {
respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
}
~
pathPrefix("testjson") {
get {
entity(as[TestC]) { c =>
respondWithMediaType(`application/json`) {
complete(c)
}
}
}
}
}
}
route 被窃听:
Error:(49, 1) illegal start of simple expression pathPrefix("testjson") { ^
path
和 pathPrefix
有什么区别?
我不确定 ~
运算符是否未正确包含。
path
是最终路径,而 pathPrefix
随后可以使用 DSL 与其他路径段组合。
如果你想完全匹配 /hello
你应该使用 path("hello")
.
pathPrefix
在
pathPrefix("hello") {
path("foo") {
complete("foo")
} ~
path("bar") {
complete("bar")
}
}
将匹配 /hello/foo
和 /hello/bar
.
话虽如此,我怀疑您遇到的错误只是 scala 解析器与 DSL 不兼容。
您能否尝试将 ~
移动到右括号所在的同一行?
我认为解析器正在推断一个分号,所以它真的将该段代码理解为
pathPrefix("hello") {
get {
respondWithMediaType(`text/html`) { // XML is marshalled to `text/xml` by default, so we simply override here
complete {
<html>
<body>
<h1>Say hello to <i>spray-routing</i> on <i>spray-can</i>!</h1>
</body>
</html>
}
}
}
};
~
pathPrefix("testjson") {
get {
entity(as[TestC]) { c =>
respondWithMediaType(`application/json`) {
complete(c)
}
}
}
}
pathPrefix(x): 这将在不匹配的 (x) 之前添加一个斜杠。为了便于使用,我们不必在指令中包含斜杠。 (斜线 ~ x).
path(x):这会在不匹配的(x)之前加一个斜杠,会匹配(x)然后加一个PathEnd。 (x) 之后的不匹配路径将被忽略。 (斜线 ~ x ~ PathEnd)
在docs中:
path(x):相当于rawPathPrefix(slash().concat(segment(x)).concat(pathEnd()))。它匹配前导斜杠后跟 x,然后是结尾。
pathPrefix(x):相当于rawPathPrefix(slash().concat(segment(x)))。它匹配前导斜杠后跟 x,然后留下不匹配的后缀。