如何以字节数组的形式访问Request [_]的主体

Leo*_*Leo 8 scala playframework playframework-2.2

只要在定义Action时使用适当的主体解析器,就可以直接访问请求体的字节数组request.body.asRaw....

但是,我现在正在建立一个ActionBuilder针对HMAC安全的行动,在那里进入身体是不可避免的.问题是ActionBuilders的定义在请求类型方面是通用的,因此也是主体解析器的定义:

def invokeBlock[A](request: Request[A], block: HmacRequest[A] => Future[SimpleResult])
Run Code Online (Sandbox Code Playgroud)

由于A没有任何类型约束,似乎没有任何方法可以从a访问请求体Request[_].

在我的具体情况下,它可以做以下事情:

request.body.asInstanceOf[AnyContentAsJson].json.toString()...
Run Code Online (Sandbox Code Playgroud)

但这对我来说不是一个可以接受的解决方案.

我也尝试定义一个自定义的身体解析器并将其应用到Request[_],但结果是空的.

如何访问a的主体Request[_](字节数组表示就足够了)?


更新:如果我可以访问其中的请求主体ActionBuilder,例如通过将整个处理包装在另一个执行自定义解析的操作中,它也是一个可接受的解决方案.但是我没有看到它是如何工作的......解决方案应该是可重用的,因为任意用户定义的动作可以与HMAC功能一起使用,而不会干扰任何用户逻辑.

joh*_*ren 0

请求类只有一个 body 字段,当 body 解析器成功解析请求正文时,将导致创建一个 Request[A] 实例。通常,将原始字节与 A 实例一起使用并不重要,因为这会为每个请求占用双倍的内存量。

主体解析器可以继续消耗或提前返回它所输入的每个字节块。也许您可以将 Hmac 验证内容实现为包装体解析器?

对于每个输入块(Array[Byte]),您将使用包装 iteratee/enumeratee 来收集字节。当输入结束时,您会触发这些字节上的 hmac 签名计算/验证,并且如果无效则可以返回 BadRequest 或将整个正文推送到实际的正文解析器。