- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在这里回答我自己的问题,因为这花了我一天多的时间才弄清楚,这是一个非常简单的问题,我认为其他人可能会遇到。
在使用 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 Question和 this 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/
使用 Spray-io 构建我的第一个 servlet 非常简单。 但是 header 中引用的资源从未找到。 ...... 必须将这些资源放在哪个目录中,或者如何引导喷雾在那里查找? 简单的问题,但
我想了解 Spray 中的指令是如何工作的。 As per the documentation : The general anatomy of a directive is as follows:
对于 POST 和 PUT 请求,我使用以下语法: put { entity(as[CaseClass]) { entity => returnsOption(entity).map(r
我正在使用 marathon-lb 运行 DC/OS 1.7。 spray.io 1.3.3 向所有 marathon-lb/HAProxy 健康检查调用返回 400:请求具有相对 URI 并且缺少主
我正在使用 marathon-lb 运行 DC/OS 1.7。 spray.io 1.3.3 向所有 marathon-lb/HAProxy 健康检查调用返回 400:请求具有相对 URI 并且缺少主
我在我的喷雾 jar 服务器中使用以下路径(使用喷雾 1.2): path("my"/"path"){ get{ complete{ val buf:Array[Byte] =
我正在尝试重现 this或 this ,但我不断收到一个我无法修复的错误... 首先,这是我的依赖项: compile 'io.spray:spray-can_2.11:1.3.1' compile
我正在用 Spray 编写一个自定义指令,用于管理任何用户请求的速率限制。 我要一个 LimitManager某个地方将处理每个请求的自定义限制和规则。这个唯一需要的信息LimitManager是 u
我的服务的所有 API 调用都是 HTTP POST,参数在多部分正文中传递。目前我的身份验证如下所示 formField("token".as[String]) { token => auth
喷雾真的很容易,但我在理解路由方面遇到了问题。这就像一只狗有时会取骨头,但通常不会。我错过了什么? 有没有办法查看Spray尝试了哪些路线,以及为什么放弃某些路线?这将基本上解决这个问题。 logRe
如何在Spray-json中正确反序列化嵌套对象? import spray.json._ case class Person(name: String) case class
来自spray.io文档页面: color extract value of parameter “color” as String color.? extract optional value of
我使用 spray 和 akka actor 构建了一个 scala 应用程序。 我的问题是请求是同步的,服务器不能同时管理很多请求。 这是正常行为吗?我该怎么做才能避免这种情况? 这是我的启动代码:
我正在尝试从 Spray 提供大型临时文件。 HTTP 请求完成后,我需要删除这些文件。到目前为止,我找不到这样做的方法...... 我使用的代码类似于 this或者这个: res
Spray-json 依赖于范围内隐式 JsonWriter[T] 的存在调用toJson时在 T 的实例上. 假设我有几个具体子类型的特征,每个子类型都有一个 JsonWriter: trait B
我正在尝试从喷雾路由中的完整指令返回一个列表。 complete { List("hello") } 但是,我收到一个错误 - Expression of type List[String] do
我正在使用喷雾路由来构建一个简单的 HTTP 服务器。该服务器调用许多需要一段时间才能响应(秒)的服务。当并发请求数变得很大时,我们想拒绝请求。否则,大量并发请求会使系统陷入困境,对任何人都不利。 有
我是Spray-Json API的新手,并且试图解析Docker REST API的Json响应。 There是使用Spray-Json解析此Google Map Json响应的一个干净示例: {
我正在使用 Spray-json 将自定义对象列表编码(marshal)到 JSON 中。我有以下案例类及其 JsonProtocol。 case class ElementResponse(name
MyService.scala:33: could not find implicit value for parameter eh: spray.routing.ExceptionHandler 我
我是一名优秀的程序员,十分优秀!