Как свернуть Директивы Распыления
Как можно свернуть эти директивы в максимально возможной степени?
Мне удалось свернуть три директивы в mainHeader, но как включить аутентификацию и 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}")
}
}
}
}
}
}
1 ответ
Маршруты распыления суперкомпостируемы, так что вы можете делать все что угодно Например, я бы написал этот маршрут так:
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}")
}
}
}
Позвольте мне объяснить этот код. Во-первых, я создал директиву authWithHeader
это читает значение заголовка и затем делает аутентификацию с этим значением. Это супер просто и все волшебство сделано flatMap
,
Затем я создал authenticatedJsonRoute
это просто набор других простых директив. Состав магии сделан с &
оператор (я говорю это как "и тогда" в этом контексте), и эти директивы будут выполняться по порядку.
Наконец, я использовал свою составленную директиву, authenticatedJsonRoute
в полном маршруте getLayer
,