如何崩溃 Spray 指令
How to collapse of Spray Directives
如何尽可能地折叠这些指令?
我能够将三个指令折叠到 mainHeader 中,但是如何同时包含 authenticate 和 responseWithMediaType?
val mainHeaders = cors & headerValueByName("Access_Token") & headerValueByName("Tenant_Name")
override def getLayer = path("api" / Segment / "model" / "layers") { modeledSystemName =>
mainHeaders { (accessToken, tenantName) =>
authenticate(validate(accessToken)) { authInfo =>
respondWithMediaType(`application/json`) {
get {
onComplete(service.getlayers(modeledSystemName, tenantName)) {
case Success(layers) => complete(layers)
//case Success(None) => complete(NotFound, "Release version not found")
case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
}
}
}
}
}
}
喷雾路线超级可组合,所以你可以做任何你想做的事。例如我会这样写这条路线:
val authWithHeader = headerValueByName("Access_Token")
.flatMap(accessToken => authenticate(validate(accessToken)))
val authenticatedJsonRoute = cors &
authWithHeader &
headerValueByName("Tenant_Name") &
respondWithMediaType(MediaTypes.`application/json`)
override val getLayer =
(get & path("api" / Segment / "model" / "layers")) { modeledSystemName =>
authenticatedJsonRoute { (authInfo, tenantName) =>
onComplete(service.getlayers(modeledSystemName, tenantName)) {
case Success(layers) => complete(layers)
//case Success(None) => complete(NotFound, "Release version not found")
case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
}
}
}
让我解释一下这段代码。首先,我创建了读取 header 值的指令 authWithHeader
,然后使用该值进行身份验证。它超级简单,所有魔法都由 flatMap
完成。
然后,我创建了 authenticatedJsonRoute
,它只是其他简单指令的组合。组合魔术是通过 &
运算符完成的(在这种情况下我将其发音为 "and then")并且这些指令将按顺序执行。
最后,我在完整的路由 getLayer
.
中使用了我的组合指令 authenticatedJsonRoute
如何尽可能地折叠这些指令?
我能够将三个指令折叠到 mainHeader 中,但是如何同时包含 authenticate 和 responseWithMediaType?
val mainHeaders = cors & headerValueByName("Access_Token") & headerValueByName("Tenant_Name")
override def getLayer = path("api" / Segment / "model" / "layers") { modeledSystemName =>
mainHeaders { (accessToken, tenantName) =>
authenticate(validate(accessToken)) { authInfo =>
respondWithMediaType(`application/json`) {
get {
onComplete(service.getlayers(modeledSystemName, tenantName)) {
case Success(layers) => complete(layers)
//case Success(None) => complete(NotFound, "Release version not found")
case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
}
}
}
}
}
}
喷雾路线超级可组合,所以你可以做任何你想做的事。例如我会这样写这条路线:
val authWithHeader = headerValueByName("Access_Token")
.flatMap(accessToken => authenticate(validate(accessToken)))
val authenticatedJsonRoute = cors &
authWithHeader &
headerValueByName("Tenant_Name") &
respondWithMediaType(MediaTypes.`application/json`)
override val getLayer =
(get & path("api" / Segment / "model" / "layers")) { modeledSystemName =>
authenticatedJsonRoute { (authInfo, tenantName) =>
onComplete(service.getlayers(modeledSystemName, tenantName)) {
case Success(layers) => complete(layers)
//case Success(None) => complete(NotFound, "Release version not found")
case Failure(ex) => complete(InternalServerError, s"An error occurred: ${ex.getMessage}")
}
}
}
让我解释一下这段代码。首先,我创建了读取 header 值的指令 authWithHeader
,然后使用该值进行身份验证。它超级简单,所有魔法都由 flatMap
完成。
然后,我创建了 authenticatedJsonRoute
,它只是其他简单指令的组合。组合魔术是通过 &
运算符完成的(在这种情况下我将其发音为 "and then")并且这些指令将按顺序执行。
最后,我在完整的路由 getLayer
.
authenticatedJsonRoute