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())
    }
  }

正在更新文件路径

现在即使 routeval.

,每个 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()
    }
  }