spray-routing note

注意穿插在spray-routing中的代码有着不同的执行时序

//MARK只会在建构get directive时打印一次而已
val route: Route = get {
  println("MARK")
  complete("yeah")
}

//每次get请求时都会打印MAY
val route: Route = get {
  complete {
    println("MAY")
    "yeah"
  }
}

在spray中使用 ~ 来连接不同的route,当第一个route被拒绝后,会转给下面的路由.

理解spray的routing structure非常重要,而且要细心一点
a,b,c 和 e 代表的是directive
任何一个directive匹配失败都无法进入其 inner route, 花括号包起来的就是inner route,例如 a { //这里是内部路由 }

val route = a {
    b {
      c {
        ... // route 1
      } ~
      d {
        ... // route 2
      } ~
      ... // route 3
    } ~
    e {
      ... // route 4
    }
  }

首先路由a如果不能匹配,就无法进入inner route也就是 b,e
b如果匹配失败会 reject,然后e再进行匹配,e如果匹配失败也就进入所谓的empty rejections,说明你的路由无法处理这个request
如果想进入到d的内部路由,得要a,b匹配成功,然后c不匹配,转由d匹配成功

使用spray-testkit撰写测试的时候,如果REQUEST被拒绝的话,就无法得到Http response对象,这就必须借助 sealRoute 这方法把Rejections转换成Http response.

以下斜体字是directive
path用于对uri做完整匹配,意思就是path底下的路由无需进行任何匹配了,完整匹配的意思也就是没有未匹配的uri.

通常会使用pathPrefix来处理较长的uri, 在pathPrefix的内部可以再使用path来做更细的匹配.

原文地址:https://www.cnblogs.com/jHenry/p/4301057.html