我想知道如何在scala和play框架中创建自己的身体解析器。 一般来说,我的用例是创建一个身体解析器,它将接受来自客户端的分块流,并且对于每个块,它将执行某些操作(而不是累积整个数据并最终执行某些操作)。
由于我找不到任何有关此主题的文档,我将不胜感激任何可以解释此问题的代码示例或链接。
答案 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实际执行此操作的博客文章: