是否可以在 http4s 服务器上的多个 http 请求之间共享纯 FP 状态?

Is it possible to share pure FP state between multiple http requests on http4s server?

我正在尝试在 http4s 服务器上的多个 http 请求之间共享状态。

那是我试过的:

for {
     state  <- Ref[F].of(0)
 
    _ <- BlazeServerBuilder[F]
         .bindHttp(port, host)
         .withHttpApp( ... httpApp that has link to "state" ... )
         .serve.compile.lastOrError

} yield  () 

在 http 请求中更改后状态保持不变。

是否可以使用 Ref 或来自 Fs2 的东西以纯 FP 样式共享“状态”?

更新:问题出在我的应用程序中。与我如何通过参考无关。我的错。

您可以在 HTTP 请求中修改状态。副作用是 IO monad 的重点,可变状态是 Ref 的目的。这是一个路由示例,它将计算它被调用的次数:

  def countRoutes[F[_]: Defer: Monad](ref: Ref[F, Int]): HttpRoutes[F] = {
    val dsl = new Http4sDsl[F]{}
    import dsl._
    HttpRoutes.of[F] {
      case GET -> Root / "count" =>
        for {
          current  <- ref.updateAndGet(_ + 1)
          resp <- Ok(current.toString)
        } yield resp
    }
  }

不过您的初始化代码看起来很奇怪。它应该是这样的:

for {
    state  <- Ref[IO].of(0)
    exitCode <- BlazeServerBuilder[F]
           .bindHttp(port, host)
           .withHttpApp( ... httpApp that has link to "state" ... )
           .serve.compile.lastOrError
} yield exitCode