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 无关。我的错。
您可以在 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)