gpt4 book ai didi

scala - 如何在 Spray 的嵌套路由中使用字符串指令提取器

转载 作者:行者123 更新时间:2023-12-02 09:32:17 25 4
gpt4 key购买 nike

在这里回答我自己的问题,因为这花了我一天多的时间才弄清楚,这是一个非常简单的问题,我认为其他人可能会遇到。

在使用 Spray 创建 RESTful-esk 服务时,我想匹配具有字母数字 ID 作为路径一部分的路由。这就是我最初的想法:

case class APIPagination(val page: Option[Int], val perPage: Option[Int])
get {
pathPrefix("v0" / "things") {
pathEndOrSingleSlash {
parameters('page ? 0, 'perPage ? 10).as(APIPagination) { pagination =>
respondWithMediaType(`application/json`) {
complete("things")
}
}
} ~
path(Segment) { thingStringId =>
pathEnd {
complete(thingStringId)
} ~
pathSuffix("subthings") {
pathEndOrSingleSlash {
complete("subthings")
}
} ~
pathSuffix("othersubthings") {
pathEndOrSingleSlash {
complete("othersubthings")
}
}
}
}
} ~ //more routes...

编译没有问题,但是当使用 scalatest 验证路由结构是否正确时,我惊讶地发现这种类型的输出:

"ThingServiceTests:"
"Thing Service Routes should not reject:"
- should /v0/things
- should /v0/things/thingId
- should /v0/things/thingId/subthings *** FAILED ***
Request was not handled (RouteTest.scala:64)
- should /v0/things/thingId/othersubthings *** FAILED ***
Request was not handled (RouteTest.scala:64)

我的路线有什么问题吗?

最佳答案

我查看了一些资源,like this SO Questionthis blog post但似乎找不到任何有关使用字符串 Id 作为路由结构的顶层部分的信息。我翻阅了spray scaladoc以及用头撞documentation on Path matchers for a while发现之前this important test (duplicated below) :

"pathPrefix(Segment)" should {
val test = testFor(pathPrefix(Segment) { echoCaptureAndUnmatchedPath })
"accept [/abc]" in test("abc:")
"accept [/abc/]" in test("abc:/")
"accept [/abc/def]" in test("abc:/def")
"reject [/]" in test()
}

这让我意识到了一些事情。我应该尝试使用 pathPrefix而不是path 。所以我将路线更改为如下所示:

get {
pathPrefix("v0" / "things") {
pathEndOrSingleSlash {
parameters('page ? 0, 'perPage ? 10).as(APIPagination) { pagination =>
respondWithMediaType(`application/json`) {
listThings(pagination)
}
}
} ~
pathPrefix(Segment) { thingStringId =>
pathEnd {
showThing(thingStringId)
} ~
pathPrefix("subthings") {
pathEndOrSingleSlash {
listSubThingsForMasterThing(thingStringId)
}
} ~
pathPrefix("othersubthings") {
pathEndOrSingleSlash {
listOtherSubThingsForMasterThing(thingStringId)
}
}
}
}
} ~

很高兴我的所有测试都通过并且路线结构正常工作。然后我将其更新为使用 Regex匹配器代替:

pathPrefix(new scala.util.matching.Regex("[a-zA-Z0-9]*")) { thingStringId =>

并决定在 SO 上为遇到类似问题的其他人发布帖子。正如 jrudolph 在评论中指出的那样,这是因为 Segment期望匹配<Segment><PathEnd>并且不要在路径中间使用。这是什么pathPrefix更有用的是

关于scala - 如何在 Spray 的嵌套路由中使用字符串指令提取器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31792107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com