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

Bog*_*nko 3 scala scala-cats http4s fs2

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

这就是我尝试过的:

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

} yield  () 
Run Code Online (Sandbox Code Playgroud)

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

是否可以使用Ref或 中的东西以纯 FP 风格共享“状态” Fs2

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

Mat*_*ndt 5

您可以在 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
    }
  }

Run Code Online (Sandbox Code Playgroud)

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

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