나는 http4s를 사용하고, 나는 응답을 일부 JSON 데이터를 생성하는 Try
있습니다http4s가 미래에 주어진 다른 상태 코드를 수행 할 수 있습니까?
case GET -> Root/"something" =>
getSomethingTry() match {
case Success(something) => Ok(something)
case Failure(CustomNotFoundException(reason)) => NotFound(reason)
case Failure(CustomConflictException()) => Conflict()
}
이 기능이 제대로 나는 Future
로 Try
을 대체 할, 그러나, Task[Response]
을 반환합니다 . 경기가 끝나면 미래가 해결되지 않았기 때문에 경기는 더 이상 작동하지 않습니다. 그래서, 나는 미래에 매핑 할 수 있습니다 :
case GET -> Root/"something" =>
getSomethingFuture().map {
something => Ok(something)
}.recover {
case CustomNotFoundException(reason) => NotFound(reason)
case CustomConflictException() => Conflict()
}
을하지만이 http4s가 원하는 것이 아니다 이는 Future[Task[Response]]
을 반환합니다. Future
을 unbox하려면 Await.result
을 사용하는 것이 적절하지 않은 것 같습니다. 이것이 스레드 풀 문제를 일으킬 수 있다고 생각합니다. 그러나 코드가 작동하도록 만듭니다.
case GET -> Root/"something" =>
Ok(getSomethingFuture())
을하지만이 날 다른 오류의 경우에 다른 상태 코드를 설정하지 않습니다
http4s는 작업 작성자의 인수로 선물을 받아들입니다. 해결 방법은 작업에서 .recover
을 수행하는 것이지만 분명히 할 수는 없습니다.
다른 Future
실패 사례가 발생할 경우 어떻게 다른 http4s 태스크 래퍼를 호출 할 수 있습니까? 미들웨어를 사용해야합니까?
가, 감사합니다 다음과 같은 방법으로 사용할 수 있습니다. 이 코드를 시도하면 암시 적으로'전략'이 필요하다는 것을 알 수 있습니다.'암시 적 val 전략 = Strategy.fromCachedDaemonPool()'을하지 말아야 할 이유가 있습니까? –
@TimothyJones 당신은 그렇게 할 수 있습니다. 나는 표준'Future' -'Strategy.fromExecutionContext (scala.concurrent.ExecutionContext.global)'의 기본값을 사용하는 것을 선호하지만 나중에 언제든지 세부 조정할 수 있습니다 (모든 서비스에 대해 새로운 전략을 작성하지 마십시오). –
감사! 우리가 가지고있는'fs2'의 버전에는 기본값이 없으므로 하나를 제공해야했습니다. –