3

我正在尝试在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是否可以使用或来自的东西以纯 FP 风格共享“状态” Fs2

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

4

1 回答 1

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

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

for {
    state  <- Ref[IO].of(0)
    exitCode <- BlazeServerBuilder[F]
           .bindHttp(port, host)
           .withHttpApp( ... httpApp that has link to "state" ... )
           .serve.compile.lastOrError
} yield exitCode
于 2020-07-05T12:48:52.037 回答