是否可以在 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
我正在尝试在 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