akka-http'Directive0'强制内部路由为每个请求单独评估?

时间:2017-03-16 13:53:47

标签: akka-http

在akka-http中,路由只评估一次(在构建时),除非它们依赖于一些动态的,提取的参数(客户端IP,请求头,任何东西)。

我的一个自定义指令取决于副作用(可能正在改变的系统文件),所以我希望每次都单独执行它。我正在寻找一个可以用它包裹的extractNothing

有这样的吗?

使用参数的能力也可以,然后我可以(extract[Unit](_) & consume)

1 个答案:

答案 0 :(得分:1)

路线仍然是动态的

您是正确的,路由只评估一次。但是,任何路线的主体都可以是动态的。

例如,假设我们有一个返回当前时间的函数:

val getTime = () => System.currentTimeMillis().toString

此功能可嵌入Route

val route = 
  get {
    path("currentTime") {
      complete(getTime())
    }
  }

更新文件路径

现在每个HttpRequest都会获得不同的时间值,即使routeval

同样,您可以在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()
    }
  }