§Essential Action
§EssentialActionとは?
EssentialActionは、Action[A]の基礎となるよりシンプルな型です。EssentialActionを理解するには、Playのアーキテクチャを理解する必要があります。
Playの中核は非常に小さく、Webプログラミングタスクを容易にするための便利なAPI、サービス、および構造に囲まれています。
基本的に、PlayのアクションAPIは抽象的に次の型を持ちます。
RequestHeader -> Array[Byte] -> Result
上記の計算は、リクエストヘッダーRequestHeader
を受け取り、次にリクエストボディをArray[Byte]
として受け取り、Result
を生成します。
この型は、リクエストボディ全体をメモリ(またはディスク)に格納することを前提としています。たとえ、その中から値を計算したいだけであっても、または、Amazon S3のようなストレージサービスに転送したいだけであってもです。
むしろ、リクエストボディのチャンクをストリームとして受信し、必要に応じて段階的に処理できるようにしたいのです。
変更する必要があるのは、2番目の矢印で、チャンク単位で入力を受け取り、最終的に結果を生成するようにすることです。まさにこれを行う型があり、それはAccumulator
と呼ばれ、2つの型パラメータを取ります。
Accumulator[E,R]
は、型E
のチャンクで入力を受け取り、最終的にR
を返す矢印の型です。APIの場合、ByteString
のチャンク(本質的にはバイト配列のより効率的なラッパー)を取り、最終的にResult
を返すAccumulatorが必要です。そこで、型を少し変更して
RequestHeader -> Accumulator[ByteString, Result]
最初の矢印では、Function[From, To]を単純に使用しており、=>
で型エイリアス化できます。
RequestHeader => Accumulator[ByteString, Result]
ここで、Accumulator[E,R]
のinfix型エイリアスを定義すると
type ==>[E,R] = Accumulator[E,R]
とすると、型をより面白い方法で記述できます。
RequestHeader => ByteString ==> Result
そして、これは次のように解釈されるはずです。リクエストヘッダーを取得し、リクエストボディを表すByteString
のチャンクを取得し、最終的にResult
を返します。これはまさにEssentialAction
型が定義される方法です。
trait EssentialAction extends (RequestHeader => Accumulator[ByteString, Result])
一方、Result
型は、抽象的にはレスポンスヘッダーとレスポンスのボディとして考えることができます。
case class Result(header: ResponseHeader, body: ByteString)
しかし、レスポンスボディ全体をメモリに格納せずに、段階的にクライアントに送信したい場合はどうすればよいでしょうか?型を改善する必要があります。ボディの型をByteString
からByteString
のチャンクを生成するものに変更する必要があります。
これを行うための型は既にあり、Source[E, _]
と呼ばれています。これは、E
のチャンクを生成できることを意味します。この場合、Source[ByteString, _]
です。
case class Result(header: ResponseHeader, body: Source[ByteString, _])
レスポンスを段階的に送信する必要がない場合は、ボディ全体を単一のチャンクとして送信することもできます。実際のAPIでは、Playはストリーミング、チャンク、および厳密なエンティティをサポートするHttpEntity
ラッパー型を使用して、さまざまなタイプのエンティティをサポートしています。
Playの組み込みヘルパー(Ok(myObject)
など)は、myObject
を、エンティティE
からHttpEntity
を作成する暗黙のWriteable[E]
インスタンスを使用してエンティティに変換することに注意してください。
§結論
Playの基本的なHTTP APIは非常にシンプルです。
RequestHeader -> Accumulator[ByteString, Result]
または、より面白い書き方
RequestHeader => ByteString ==> Result
これは、次のように解釈されます。RequestHeader
を受け取り、次にByteString
のチャンクを受け取り、レスポンスを返します。レスポンスは、ResponseHeaders
と、ソケットに書き込まれるSource[E, _]
型で表される、ByteString
に変換可能な値のチャンクであるボディで構成されます。
次へ: HTTPフィルター
このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、お気軽にプルリクエストを送信してください。質問や共有するアドバイスがありますか?コミュニティフォーラムに参加して、コミュニティと会話を始めましょう。