0

我有两个动作。第一个服务于单一资产,第二个应该服务于所有单一资产组合成一个资产。所以我的想法是从服务于组合资产的第二个动作中调用为单个资产提供服务的第一个动作。你们中的一些人会说这是一个坏主意,因为我可以直接从文件系统加载资产并将它们组合起来。但这是不可能的,因为第一个操作与其他操作链接在一起以对资产执行一些额外的操作(指纹识别,...)。

所以这是我的行动:

第一个服务于单一资产。在这个实现中,它只调用链中的下一个动作。

abstract override def at(path: String, file: String): Action[AnyContent] = {
  super.at(path, file)
}

第二个接受 JSON 格式的文件列表。然后它遍历列表并使用单个文件调用第一个操作。

def consolidate = Action(parse.json) { request =>
  val files = request.body.as[List[String]]
  for (file <- files) {
    val action = at(path, new URL(file).getPath.substring(1))
    val result = action.apply(request)
  }
  Ok()
}

现在我的问题是,我怎样才能将资产作为字符串?变量 result 包含一个Iteratee[Array[Byte], Result]. 如何从中提取资产数据?

play.api.test.Helper对象包含一个contentAsString和一个contentAsBytes方法。但这对我没有进一步的帮助!

4

1 回答 1

0

Iteratee代表行动的消费者方面。没有返回该方法的文档,Iteratee但我猜测它将用于在请求期间使用来自客户端的数据输入流。所以,简而言之,它在这里对你没有帮助。

您可以从第一个操作中获取代码,您需要调用该操作consolidate并将其分解到某个方法中,并在两个操作中使用该方法。这对你可行吗?

于 2013-04-23T14:34:43.747 回答