Scala 重头戏2.4:拦截和修改响应体

Scala 重头戏2.4:拦截和修改响应体,scala,playframework,playframework-2.4,Scala,Playframework,Playframework 2.4,根据这一点,自定义操作应该是这样的: object CustomAction extends ActionBuilder[Request] { def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = { block(request) } } block.apply(request).flatMap { res =>

根据这一点,自定义操作应该是这样的:

object CustomAction extends ActionBuilder[Request] {
    def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = {
        block(request)
    }
}
block.apply(request).flatMap { res =>
  Iteratee.flatten(res.body |>> Iteratee.consume[Array[Byte]]()).run.map { byteArray =>
    val bodyStr = new String(byteArray.map(_.toChar))
    Ok(bodyStr + "foo")
  }
}
但是,如果我想在每个响应体中附加“foo”,我该怎么做呢?显然,以下方法不起作用:

block.andThen(result => result.map(r => r.body.toString + "foo")).apply(request)
有什么想法吗

更新:值得一提的是,此操作在控制器中主要用作异步:

def test = CustomAction.async {
    //...
}

您需要从
结果
主体中获取
枚举器[Array[Byte]]
,并将其提供给迭代者,以实际使用结果主体,然后才能修改它。因此,使用结果体并转换为字符串的简单迭代对象可能如下所示:

object CustomAction extends ActionBuilder[Request] {
    def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = {
        block(request)
    }
}
block.apply(request).flatMap { res =>
  Iteratee.flatten(res.body |>> Iteratee.consume[Array[Byte]]()).run.map { byteArray =>
    val bodyStr = new String(byteArray.map(_.toChar))
    Ok(bodyStr + "foo")
  }
}

我使用了
flatMap
作为运行
Iteratee的结果。flatte
是一个
Future[T]
。查看有关如何使用枚举数/迭代者的更多详细信息。

谢谢,这是可行的,但是有一个问题-解决方案默认为
Ok
,并将覆盖其他响应类型,例如
BadRequest
,我的示例很简单,为了使其更加完整,您需要从ResponseHeader处读取结果状态,并适当地处理新结果