Akka路由DSL与预期路由不匹配

Akka路由DSL与预期路由不匹配,akka,akka-http,Akka,Akka Http,这里有三条我想要匹配的路线 /games/2016/1 /games/2016 /games 我正试图通过这种路由结构来实现这一点: pathPrefix("games") { logger.info("INSIDE GAMES PATH KEY ") path(PathEnd) { complete("no numbers") } ~ path(IntNumber / IntNumber) { case (year: Int, week: Int) => l

这里有三条我想要匹配的路线

/games/2016/1
/games/2016
/games
我正试图通过这种路由结构来实现这一点:

pathPrefix("games") {
  logger.info("INSIDE GAMES PATH KEY ")
  path(PathEnd) {
    complete("no numbers")
  } ~ path(IntNumber / IntNumber) { case (year: Int, week: Int) =>
    logger.info("Matched week/year")
    //gets games for this year and week
    complete("two numbers")
  } ~ path(IntNumber) { year: Int =>
    logger.info("Matched year")
    complete("one number")
  }
}
这适用于我的前两个示例,但不适用于最后一个。我做错了什么,我如何修复它,使我的路线匹配
/games

我尝试将
PathEnd
切换到
PathNetural
保留路径
等,但都没有效果

编辑:我正在使用的测试用例:

  it must "return all games for this week" in {
    Get("/games") ~>
      NflRoutes.gamesRoutes ~> check {
      val games: Seq[NflGame] = responseAs[Seq[NflGame]]
      games.size must be (14)
    }
  }
以及日志中的错误:

> test-only *NflRoutesTest*
[info] Compiling 1 Scala source to /home/chris/dev/suredbits-api/target/scala-2.11/classes...
[info] Compiling 1 Scala source to /home/chris/dev/suredbits-api/target/scala-2.11/test-classes...
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/chris/dev/suredbits-api/lib/nfldb-api-assembly-0.0.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/chris/.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
13:09:39.721 TKD [com-suredbits-api-routes-NflRoutesTest-akka.actor.default-dispatcher-3] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started
13:09:39.907 TKD [suredbits-api-akka.actor.default-dispatcher-4] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started
13:09:40.012 TKD [pool-9-thread-6-ScalaTest-running-NflRoutesTest] INFO  c.suredbits.api.routes.NflRoutes$ - INSIDE GAMES PATH KEY 
[info] NflRoutesTest:
[info] - must return all games for this week *** FAILED ***
[info]   Request was rejected (DynamicVariable.scala:58)
[info] ScalaTest
[info] Run completed in 934 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 0, failed 1, canceled 0, ignored 0, pending 0
[info] *** 1 TEST FAILED ***
[error] Failed: Total 1, Failed 1, Errors 0, Passed 0
[error] Failed tests:
[error]     com.suredbits.api.routes.NflRoutesTest
[error] (test:testOnly) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 4 s, completed Oct 10, 2016 1:09:40 PM
> 

首先尝试对路径端进行匹配。基于此,我添加了一些基本逻辑来代替您的

val fooRoute = pathPrefix("games") {
  pathEnd { complete ("empty path") } ~
  path(IntNumber / IntNumber) {case (a : Int, b : Int) => complete(s"a = $a b = $b")} ~
  path(IntNumber) { case a : Int => complete(s"a = $a")}
}
可使用以下通过的代码测试此路线:

Get("/games") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "empty path"
}

Get("/games/2016") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "a = 2016"
}

Get("/games/2016/1") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "a = 2016 b = 1"
}

首先尝试对路径端进行匹配。基于此,我添加了一些基本逻辑来代替您的

val fooRoute = pathPrefix("games") {
  pathEnd { complete ("empty path") } ~
  path(IntNumber / IntNumber) {case (a : Int, b : Int) => complete(s"a = $a b = $b")} ~
  path(IntNumber) { case a : Int => complete(s"a = $a")}
}
可使用以下通过的代码测试此路线:

Get("/games") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "empty path"
}

Get("/games/2016") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "a = 2016"
}

Get("/games/2016/1") ~> fooRoute ~> check {
  responseAs[String] equalsIgnoreCase "a = 2016 b = 1"
}

@ChrisStewart我添加了一些通过的功能和单元测试。你能详细解释一下“不起作用”吗?我编辑了这个OP以使它更真实,注意当我测试我的路径时,日志消息
“INSIDE GAMES PATH KEY”
被点击。@ChrisStewart将
路径(PathEnd){…
更改为指令
PathEnd{…
。文档中有一个注释:空字符串(也称为空单词或标识)是字符串连接操作的中性元素,因此它将匹配所有内容,但请记住,path需要匹配整个剩余路径。您还可以使用
pathPrefix(IntNumber){a=>pathEnd{/*您的上一个case*/}~path(IntNumber){b=>/*您的第二个case*/}创建一个实际的树
@ChrisStewart我添加了一些通过的功能和单元测试。你能详细说明一下“不起作用”吗?我编辑了OP以更真实一些,请注意,当我测试我的路径时,日志消息
“游戏内路径键”
。@ChrisStewart将
路径(路径端){…
更改为指令
路径端{…
。文档中有一个注释:空字符串(也称为空单词或标识)是字符串连接操作的中性元素,因此它将匹配所有内容,但请记住,路径需要匹配整个剩余路径。您还可以使用
路径前缀(IntNumber){a=>pathEnd创建实际的树{/*您的上一个case*/}~path(IntNumber){b=>/*您的第二个case*/}}