注意穿插在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来做更细的匹配.