在akka-http中,路由只评估一次(在构建时),除非它们依赖于一些动态的,提取的参数(客户端IP,请求头,任何东西)。
我的一个自定义指令取决于副作用(可能正在改变的系统文件),所以我希望每次都单独执行它。我正在寻找一个可以用它包裹的extractNothing
。
有这样的吗?
使用参数的能力也可以,然后我可以(extract[Unit](_) & consume)
。
答案 0 :(得分:1)
路线仍然是动态的
您是正确的,路由只评估一次。但是,任何路线的主体都可以是动态的。
例如,假设我们有一个返回当前时间的函数:
val getTime = () => System.currentTimeMillis().toString
此功能可嵌入Route
:
val route =
get {
path("currentTime") {
complete(getTime())
}
}
更新文件路径
现在每个HttpRequest都会获得不同的时间值,即使route
是val
。
同样,您可以在akka中使用streaming file io来创建动态HttpResponse
,其实体是您更改文件的内容:
val fileResponse = () => {
val file = Paths get "sourceFile.txt"
val chunkSource = FileIO fromPath file
val chunkEntity =
Chunked.fromData(ContentTypes.`text/plain(UTF-8)`, chunkSource)
HttpResponse(entity = chunkEntity)
}
val fileRoute =
get {
path("sourceFile") {
complete(fileResponse())
}
}
内在&外部路线
将示例1步骤进一步扩展到动态路由,您可以编写一个每隔一次失败的函数:
val halfBaked = () => {
var isGood = true
() => {
if(isGood) {
isGood = false
complete(fileResponse())
}
else {
isGood = true
complete(StatusCodes.InternalServerError)
}
}
}
将其包裹在外部路线中:
val innerRoute = halfBaked()
val outerRoute =
get {
path("feelingLucky") {
innerRoute()
}
}