2017-10-04 15 views
1

나는 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() 
    } 

이 기능이 제대로 나는 FutureTry을 대체 할, 그러나, 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 태스크 래퍼를 호출 할 수 있습니까? 미들웨어를 사용해야합니까?

답변

1

http4s 0.17 이상을 사용한다고 가정하면 Taskfs2.Task입니다.

그것은 후자로 FutureTask로 변환 한 후 거래를 쉽게 :

내가 권하고 싶습니다
case GET -> Root/"something" => 
    Task.fromFuture(getSomethingFuture()) 
    .flatMap { 
     something => Ok(something) 
    } 
    .handleWith { 
     case CustomNotFoundException(reason) => NotFound(reason) 
     case CustomConflictException() => Conflict() 
    } 

, 그러나, 당신은 그나마 Try 또는 Future

+0

가, 감사합니다 다음과 같은 방법으로 사용할 수 있습니다. 이 코드를 시도하면 암시 적으로'전략'이 필요하다는 것을 알 수 있습니다.'암시 적 val 전략 = Strategy.fromCachedDaemonPool()'을하지 말아야 할 이유가 있습니까? –

+0

@TimothyJones 당신은 그렇게 할 수 있습니다. 나는 표준'Future' -'Strategy.fromExecutionContext (scala.concurrent.ExecutionContext.global)'의 기본값을 사용하는 것을 선호하지만 나중에 언제든지 세부 조정할 수 있습니다 (모든 서비스에 대해 새로운 전략을 작성하지 마십시오). –

+0

감사! 우리가 가지고있는'fs2'의 버전에는 기본값이 없으므로 하나를 제공해야했습니다. –

0

대신 프로그램을 통해 Task를 사용하는 미래를 푸는 데 정말로 필요합니다. Play 프레임 워크는 Future를 반환하기위한 action.async를 제공합니다.

당신이이 우수

Action.async { 
    getSomethingFuture().map { 
    something => Ok(something) 
    }.recover { 
    case CustomNotFoundException(reason) => NotFound(reason) 
    case CustomConflictException() => Conflict() 
    } 
} 

https://www.playframework.com/documentation/2.6.x/ScalaAsync#returning-futures

+0

http4s는 재생되지 않습니다. –

+0

Oleg에 동의합니다. -이 시점에서 적절하지 않은'Action'을 생성합니다. ('Ok()'등의 도우미도 올바른 타입을 가지고 있지 않습니다) –