如何使用Scalatra更改AsyncResult的HTTP状态代码

时间:2015-06-18 19:50:40

标签: scala akka scalatra

我创建了一个简单的控制器(下面的代码经过混淆和简化,假设ask返回带有消息的未来)。我想要做的是将HTTP代码从200以外的其他东西更改(基于演员结果)。

执行下面的代码时,我看到结果按预期返回,但使用200而不是404

/

另一次尝试是

   get("/:id") {
        new AsyncResult() {
          val is: Future[_] = ask(actor, message)(timeout.toMillis)
          is.onComplete { res =>
            res match {
              case Success(result:Any) => NotFound(result) //Not found is just an example of a different HTTP code other than 200
          }
       }
    }

在这种情况下,我收到NullPointerException,因为case Success(result:Any) => { this.status_ = (404) result } (HTTPServletResponse)为空,因为响应是在一个单独的线程上。

TL; DR

如何在Scalatra中有条件地更改AsyncResult / Future的HTTP代码?

详情

Scala 2.11.6

Scalatra 2.3.0

Akka 2.3.9

2 个答案:

答案 0 :(得分:2)

在Scalatra FutureSupport mixin中进行了一些挖掘后,我发现:

implicit val response: HttpServletResponse = scalatraContext.response

定义为AsyncResult的成员,允许我在onComplete回调中更改HTTP请求的状态代码。

答案 1 :(得分:0)

如果需要,您实际上可以将Future[ActionResult]返回到is。然后在Future内部,您可以返回Ok()