我正在使用http4s,并且我有一个Try
为响应生成一些 json 数据:
case GET -> Root / "something" =>
getSomethingTry() match {
case Success(something) => Ok(something)
case Failure(CustomNotFoundException(reason)) => NotFound(reason)
case Failure(CustomConflictException()) => Conflict()
}
此函数正确返回一个Task[Response]
但是,我想Try
用Future
. 匹配不再起作用,因为未来可能在匹配时尚未解决。所以,我可以映射未来:
case GET -> Root / "something" =>
getSomethingFuture().map {
something => Ok(something)
}.recover {
case CustomNotFoundException(reason) => NotFound(reason)
case CustomConflictException() => Conflict()
}
但这会返回 aFuture[Task[Response]]
这不是 http4s 想要的。Await.result
用它来拆箱似乎不合适Future
——我认为这可能会导致线程池问题——但它确实使代码工作。
http4s 接受期货作为任务创建者的参数:
case GET -> Root / "something" =>
Ok(getSomethingFuture())
但这并不能让我在出现不同错误时设置不同的状态码。一个解决方案可能是执行.recover
一项任务,但我看不到一个明显的方法来做到这一点。
Future
如果出现不同的失败情况,我如何调用不同的 http4s 任务包装器?我需要使用中间件吗?