§Play HTTP API の概要
§EssentialAction とは?
EssentialAction
は、Play の HTTP API で使用される基盤となる関数型です。これは Java の Action
型とは異なり、Request
を受け取り CompletionStage<Result>
を返すより高レベルの型です。ほとんどの場合、Java アプリケーションで EssentialAction
を直接使用する必要はありませんが、フィルタの作成や他の低レベル Play API との連携に役立つ場合があります。
EssentialAction
を理解するには、Play のアーキテクチャを理解する必要があります。
Play のコアは非常に小さく、Web プログラミングのタスクを容易にするための多くの便利な API、サービス、構造によって囲まれています。
基本的に、Play のアクション API は抽象的に次の型を持ちます。
RequestHeader -> byte[] -> Result
上記は、リクエストヘッダー RequestHeader
を受け取り、リクエストボディを byte[]
として受け取り、Result
を生成します。
この型は、値を計算するだけの場合でも、または Amazon S3 のようなストレージサービスに転送する場合でも、リクエストボディ全体をメモリ(またはディスク)に格納することを前提としています。
むしろ、リクエストボディのチャンクをストリームとして受け取り、必要に応じて段階的に処理できるようにしたいと考えています。
変更する必要があるのは、2 番目の矢印で、チャンクで入力を受け取り、最終的に結果を生成するようにします。これを行う型があり、それは Accumulator
と呼ばれ、2 つの型パラメーターを取ります。
Accumulator<E,R>
は、E
型のチャンクで入力を受け取り、最終的に R
を返すアローの一種です。私たちの API では、ByteString
のチャンク(基本的にバイト配列のより効率的なラッパー)を受け取り、最終的に Result
を返す Accumulator が必要です。そのため、型をわずかに変更して
RequestHeader -> Accumulator<ByteString, Result>
最終的に、Java の型は次のようになります。
Function<RequestHeader, Accumulator<ByteString, Result>>
これは次のように解釈されます。リクエストヘッダーを受け取り、リクエストボディを表す ByteString
のチャンクを受け取り、最終的に Result
を返します。これは、EssentialAction
の apply メソッドが定義されている方法とまったく同じです。
public abstract Accumulator<ByteString, Result> apply(RequestHeader requestHeader);
一方、Result
型は、レスポンスヘッダーとレスポンスのボディとして抽象的に考えることができます。
Result(ResponseHeader header, ByteString body)
しかし、レスポンスボディをメモリに完全に格納せずに、クライアントに段階的に送信したい場合はどうでしょうか?型を改善する必要があります。ボディの型を ByteString
から ByteString
のチャンクを生成するものに変更する必要があります。
すでにこのための型があり、Source<E, ?>
と呼ばれ、E
のチャンク、つまりこの場合は Source<ByteString, ?>
を生成できることを意味します。
Result(ResponseHeader header, Source<ByteString, ?> body)
レスポンスを段階的に送信する必要がない場合でも、ボディ全体を単一のチャンクとして送信できます。実際の API では、Play はストリーミングされたエンティティ、チャンクされたエンティティ、厳密なエンティティをサポートする HttpEntity
ラッパー型を使用して、さまざまなタイプのエンティティをサポートしています。
§結論
Play の基本的な HTTP API は非常にシンプルです。
RequestHeader -> Accumulator<ByteString, Result>
これは次のように解釈されます。RequestHeader
を受け取り、ByteString
のチャンクを受け取り、レスポンスを返します。レスポンスは、ResponseHeaders
と、Source<E, ?>
型で表されるソケットに書き込まれる ByteString
に変換可能な値のチャンクであるボディで構成されています。
次へ: HTTP フィルタ
このドキュメントに誤りを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを自由に送ってください。ご質問やアドバイスがありましたら、コミュニティフォーラムにアクセスして、コミュニティとの会話を始めてください。