ドキュメント

§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フィルター


このドキュメントにエラーを見つけましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、お気軽にプルリクエストを送信してください。質問や共有するアドバイスがありますか?コミュニティフォーラムに参加して、コミュニティと会話を始めましょう。