2013-12-08 17 views
1

我想知道如何在scala和play框架中創建我自己的body parser。 一般來說,我的用例是創建一個body parser,它將接受來自客戶端的分塊流,併爲每個塊執行一些操作(而不是累積整個數據並最終完成某些操作)。在框架中編寫一個body parser

因爲我找不到任何有關此主題的文檔,我將不勝感激任何代碼示例或鏈接,可以解釋這一點。

回答

1

當你說「chunked」時,你的意思是在HTTP協議級別分塊,如Transfer-Encoding: chunked?雖然您可以處理數據的「塊」,但在「播放」中,這些不必將1對1與分塊編碼中的塊相關聯。實際上,你絕不應該依賴這些塊的劃分,因爲對於任何代理來說,它都是合法的,或者以不同的長度重新綁定它。所以,你應該確保塊中的任何協議都能夠指示你的邏輯數據塊的開始和結束,而不管底層流如何被實際編碼,說明你的代碼接收到的每個實際塊包含多個邏輯組塊,部分邏輯組塊或兩者。

所以,有了這個理解,爲了解析你的數據,你需要編寫一個迭代器。播放BodyParser本質上是一個函數,它需要一個RequestHeader,並返回Iteratee[Array[Byte], B],它解析B類型的主體。我寫了一篇博客文章,在這裏解釋iteratees:

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/

+0

我明白,當我實現我自己的身體解析器我要實現它的應用方法,它應該返回一個Iteratee [數組[字節],要麼[結果,INT]] 不過,我不知道它的摺疊方法應該如何。 我知道它的聲明應該是這樣的: def fold [B](folder:(Step [Array [Byte],或者[Result,Int]])=> Future [B])(隱式ec:ExecutionContext):未來[B] 但我不知道它的身體應該如何實施。 – Mizh

相關問題