喷涂:路由 - 了解path和pathPrefix之间的区别

时间:2015-08-06 14:44:13

标签: scala spray

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被窃听:

  

错误:(49,1)非法启动简单表达式         pathPrefix(“testjson”){^

pathpathPrefix之间有什么区别? 我不确定~运算符是否未正确包含在内。

3 个答案:

答案 0 :(得分:10)

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)
        }
      }
    }
  }

答案 1 :(得分:0)

pathPrefix(x):这将在不匹配的(x)之前添加一个斜杠。为了易于使用,我们不必在指令中包含斜杠。 (斜线〜x)。

path(x):这将在不匹配的(x)之前添加一个斜杠,将匹配(x),然后添加一个PathEnd。 (x)之后的不匹配路径将被忽略。 (斜线〜x〜PathEnd)

答案 2 :(得分:0)

docs中:

路径(x):等效于rawPathPrefix(slash()。concat(segment(x))。concat(pathEnd()))。它匹配一个前导斜杠,后跟x,然后是结尾。

pathPrefix(x):等效于rawPathPrefix(slash()。concat(segment(x)))。它与后跟x的前斜杠匹配,然后使后缀不匹配。