喷涂路由多个深度路径

zme*_*eda 6 routing scala spray

我有4个基于URL的响应级别.所以对于:
*GET on /abc- >响应应该是abc
*GET on /abc/def- >响应应该是def
*GET on /abc/def/ghi- >响应应该是ghi
*GET on /abc/def/ghi/jkl- >响应应该(令人惊讶)jkl

所以我的问题是如何使用Spray.io设计这种请求 - 响应属性?

我知道使用pathPrefixwith path是可能的,但这只是两个级别?使用这种方法,它应该看起来像:

val route = {
  path("/abc") {
    // complete with response 'abc'
  } ~
  path("/abc/def") {
    // complete with response 'def'
  } ~
  path("/abc/def/ghi") {
    // complete with response 'ghi'
  } ~
  path("/abc/def/ghi/jkl") {
    // complete with response 'jkl'
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法"筑巢路径"?我知道这不起作用,但只是一个想法:

val route = {
  path("/abc") {
    // complete with response 'abc'
    'sub'path("/def") {
      // complete with response 'def'
      'sub'path("/ghi") {
        // complete with response 'ghi'
        'sub'path("/jkl") {
          // complete with response 'jkl'
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或任何其他适当的嵌套路径?

最好的,zmeda

jru*_*lph 13

我认为问题是关于如何做到两者,如果路径完成则在一个层面上完成某些事情,或者如果还有更多路径可用则更深入一层.

试试这个:

val route = {
  pathPrefix("abc") {
    // complete with response 'abc'
    pathEnd { complete("abc") } ~ // don't forget the twiggles
    pathPrefix("def") {
      pathEnd { complete("def") } ~
      pathPrefix("ghi") {
        pathEnd { complete("ghi") } ~
        path("jkl") { // path already includes pathEnd, path(x) = pathPrefix(x ~ PathEnd)
          complete("jkl")
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句.这与"/ abc /"等不匹配,即带有斜杠的路径.如果你想强制匹配尾部斜杠或者可选择使用pathSingleSlashpathEndOrSingleSlash代替pathEnd.