玩2.4:拦截和修改响应体

时间:2015-12-07 09:46:28

标签: scala playframework playframework-2.4

根据play documentation,这就是自定义操作的样子:

object CustomAction extends ActionBuilder[Request] {
    def invokeBlock[A](request: Request[A], block: Request[A] => Future[Result]): Future[Result] = {
        block(request)
    }
}

但是如果我想向每个回复机构追加“foo”,我该怎么做?显然下面不起作用:

block.andThen(result => result.map(r => r.body.toString + "foo")).apply(request)

有什么想法吗?

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

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

1 个答案:

答案 0 :(得分:2)

您需要从Enumerator[Array[Byte]]主体获取Result并将其提供给迭代器,以便在您修改结果主体之前实际使用结果主体。因此,使用结果体并转换为String的简单迭代可能如下所示:

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.flatten的结果是Future[T]。查看https://www.playframework.com/documentation/2.4.x/Enumerators以获取有关如何使用枚举器/迭代器的更多详细信息。