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*/}}