2013-12-08 2 views
1

Я хотел бы знать, как создать собственный собственный парсер тела в scala и play framework. В общем, моим вариантом использования является создание синтаксического анализатора тела, который будет принимать поток chunked от клиента, и для каждого блока он выполнит какое-то действие (а не аккумулирует все данные и что-то сделает в конце).написать сиквел тела в игровом каркасе

Поскольку я не мог найти документацию по этой теме, я был бы признателен за любые примеры кода или ссылку, которые объяснят это.

ответ

1

Когда вы говорите «chunked», вы имеете в виду, что на уровне протокола HTTP, как в? В то время как вы можете работать с «кусками» данных, в Play они не обязательно соотносятся с 1 к 1 с кусками в закодированном кодировании. На самом деле, вы никогда не должны полагаться на демаркацию этих кусков, так как совершенно законно для любого прокси-сервера отчуждать его или переписывать на разных этапах. Таким образом, вы должны убедиться, что любой протокол в кусках может указывать начало и конец ваших логических фрагментов данных, независимо от того, как базовый поток фактически закодирован, учитывая тот факт, что каждый фактический кусок, который получает ваш код, может содержат несколько логических фрагментов, частичные логические фрагменты или и то, и другое.

Итак, при таком понимании, чтобы проанализировать ваши данные, вам нужно написать итерацию. A Воспроизведение 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 [Array [Byte], либо [Result, Int]] Однако я не уверен, как выглядит его метод сгиба. Я знаю, что его объявление должно быть примерно таким: def fold [B] (папка: (Step [Array [Byte], либо [Result, Int]]) => Future [B]) (неявный ec: ExecutionContext): Будущее [B] , но я не знаю, как его тело должно быть реализовано. – Mizh

Смежные вопросы