akka-http 'Directive0' 强制为每个请求单独评估内部路由?
akka-http 'Directive0' to force the inner route be evaluated separately for each request?
在 akka-http 中,路由只被评估一次(在构建时),除非它们依赖于一些动态的、提取的参数(客户端 IP、请求 header、任何东西)。
我的自定义指令之一取决于副作用(可能会更改的系统文件),因此我希望每次都单独执行它。我正在寻找可以用来包裹它的 extractNothing
。
有这样的吗?
使用参数的能力也可以,那么我可以(extract[Unit](_) & consume)
。
路由仍然是动态的
你说的路线只评估一次是正确的。但是,任何路由的主体本质上都可以是动态的。
举个例子,假设我们有一个函数returns当前时间:
val getTime = () => System.currentTimeMillis().toString
这个函数可以嵌入到Route
:
val route =
get {
path("currentTime") {
complete(getTime())
}
}
正在更新文件路径
现在即使 route
是 val
.
,每个 HttpRequest 都会返回不同的时间值
同样,您可以在 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())
}
}
内部和外部路线
将示例进一步扩展到动态路由,您可以编写一个每隔一段时间就会失败的函数:
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()
}
}
在 akka-http 中,路由只被评估一次(在构建时),除非它们依赖于一些动态的、提取的参数(客户端 IP、请求 header、任何东西)。
我的自定义指令之一取决于副作用(可能会更改的系统文件),因此我希望每次都单独执行它。我正在寻找可以用来包裹它的 extractNothing
。
有这样的吗?
使用参数的能力也可以,那么我可以(extract[Unit](_) & consume)
。
路由仍然是动态的
你说的路线只评估一次是正确的。但是,任何路由的主体本质上都可以是动态的。
举个例子,假设我们有一个函数returns当前时间:
val getTime = () => System.currentTimeMillis().toString
这个函数可以嵌入到Route
:
val route =
get {
path("currentTime") {
complete(getTime())
}
}
正在更新文件路径
现在即使 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())
}
}
内部和外部路线
将示例进一步扩展到动态路由,您可以编写一个每隔一段时间就会失败的函数:
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()
}
}