2017-11-20 11 views
0

私はプレイフレームワークを使用してスカラーWebアプリケーションを開発していますが、リクエストを検証するために初めてフィルターを使用しましたが、結果が得られませんでした。ここでの方法は、私のActionBuilderオブジェクトであるActionBuilderがnullのrequestBodyを返しています

object MyJsonAction extends ActionBuilder[Request, Response] with Results { 
    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { 
    println (request.body)// returning null everytime why ? 
     block(request) 
    } 

    override def parser = { // what does this method do, i think the problem started from here :/ ? 
    null; 

    } 

    override protected def executionContext = { 

    null; 
    } 
} 

まあ、遊びの枠組みだけのシンプルな例とは多くのリソースがないと何の例では、彼らはあなたが内緒リクエストボディを得ることができることを教えて、これらのメソッドが何をしているかを説明簡単にはありませんあなたはどのように!すべてが曖昧です!私は3日後からそれに固執しています。私は今何をすべきか分かりません。ありがとう

答えて

1

は、Actionを作成するオブジェクトです。 Actionは、BodyParser[T]を結合しています。要求本体を読み取ってTを構成し、Request[T] => Future[Result]という関数を使用してTを処理します。

デフォルトのActionBuilderは非常に簡単な方法でこれを行います。それはBodyParserの結果を連鎖させ、それを関数に送ります。カスタムActionBuilderを作成した場合は、関数呼び出しの前または後に独自のロジックを挿入するなどして、このプロセスをオーバーライドすることができます。

あなた自身ActionBuilderを作っているなら、私は、テンプレートとして、以下のようなもので始まることをお勧めしたい:

@Singleton 
class MyJsonAction @Inject() (
    bodyParsers: PlayBodyParsers, 
    ec: ExecutionContext) extends ActionBuilder[Request, JsValue] { 

    def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { 
    println(request.body) // DO SOMETHING HERE 
    block(request) 
    } 
    override def parser = bodyParsers.json 
    override protected def executionContext = ec 
} 

その後、あなたはこのようなあなたのコントローラでそれを使用することができます。

class MyController @Inject() (myJsonAction: MyJsonAction) { 
    def index = myJsonAction { req: Request[JsValue] => ??? } 
} 
1

parser: BodyParser[A]重要な部分は、入力バイトを受け取り、タイプAに変換することです。

たとえば、BodyParser[JsValue]JsValueのボディを生成します。これはJsonを読み込むために使用されます。

オブジェクトを検証しようとしている場合、アクションビルダが適切な場所ではない可能性があります。 BodyParsersjson validation

+0

なぜか教えてくれますか ?アクションビルダはjsonリクエストを検証するのに適していませんか? –

+0

私の意見では、ボディパーサはすでにこれを担当しています。しかし、@ rich-doughertyが示唆しているように、アクションビルダーでも行うことができます。アプリケーションをどのように構造化するかは、「悪い場所」ではなく、一貫性とシンプルさを維持することが重要です – vdebergue

関連する問題