在play框架中编写一个body解析器

时间:2013-12-08 16:14:56

标签: scala playframework streaming

我想知道如何在scala和play框架中创建自己的身体解析器。 一般来说,我的用例是创建一个身体解析器,它将接受来自客户端的分块流,并且对于每个块,它将执行某些操作(而不是累积整个数据并最终执行某些操作)。

由于我找不到任何有关此主题的文档,我将不胜感激任何可以解释此问题的代码示例或链接。

1 个答案:

答案 0 :(得分:1)

当你说“chunked”时,你的意思是在HTTP协议级别,如Transfer-Encoding: chunked中那样?虽然您可以处理数据的“块”,但在Play中,这些并不一定将1对1与分块编码中的块相关联。事实上,你永远不应该依赖这些块的划分,因为任何代理都可以将其拆除,或者以不同的长度重新安装它是完全合法的。因此,您应该确保块中的任何协议能够指示逻辑数据块的开始和结束,而不管底层流是如何实际编码的,考虑到代码接收的每个实际块可能的事实包含多个逻辑块,部分逻辑块或两者。

因此,根据这种理解,要解析数据,您需要编写一个iteratee。 Play BodyParser本质上是一个函数,它接受RequestHeader,并返回Iteratee[Array[Byte], B],它解析B类型的主体。我写了一篇博文,在这里解释迭代:

http://jazzy.id.au/default/2012/11/06/iteratees_for_imperative_programmers.html

您可能用于划分块的协议示例可能是JSON,这里有一篇关于如何使用JSON实际执行此操作的博客文章:

http://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/