このマニュアルは現在進行中で、現在未完成です。
改善に協力していただける場合は、READMEをご覧ください。

12 静的資産

Ratpack は、静的ファイルをレスポンスとして提供するためのサポートを提供します。

1.12 ディレクトリから

Ratpack アプリケーションには “基本ディレクトリ” の概念があり、起動時に指定されます。これは効果的に、アプリケーションに関してファイルシステムのルートです。基本ディレクトリのファイルは Chain.files() メソッドを使用して提供できます。

import ratpack.test.embed.EmbeddedApp;
import ratpack.test.embed.EphemeralBaseDir;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Example {
  public static void main(String... args) throws Exception {
    EphemeralBaseDir.tmpDir().use(baseDir -> {
      baseDir.write("public/some.text", "foo");
      baseDir.write("public/index.html", "bar");

      EmbeddedApp.of(s -> s
        .serverConfig(c -> c.baseDir(baseDir.getRoot()))
        .handlers(c -> c
          .files(f -> f.dir("public").indexFiles("index.html"))
        )
      ).test(httpClient -> {
        assertEquals("foo", httpClient.getText("some.text"));
        assertEquals("bar", httpClient.getText());
        assertEquals(404, httpClient.get("no-file-here").getStatusCode());
      });

    });
  }
}

ファイルは、ファイルのアドバタイズされた最終更新タイムスタンプに基づいて Last-Modified ヘッダーで提供されます。クライアントが If-Modified-Since ヘッダーを送信した場合、ファイルが指定された値以降に変更されていない場合、Ratpack は 304 レスポンスで応答します。提供されるファイルに ETags は含まれません。

デフォルトでは、ファイルはクライアントが要求した場合に有線で GZIP 圧縮されます。これは、 Response.noCompress() メソッドを呼び出すことで、リクエストごとに無効にすることができます。これは通常、リクエストパス(例: ファイル拡張子)を検査し、圧縮を無効にするファイル提供ハンドラの前にハンドラを置くことで使用されます。

2.12 アドホック ファイル

個々のファイルは、 Context.file() メソッドと Context.render() メソッドを使用して提供できます。

import ratpack.test.embed.EmbeddedApp;
import ratpack.test.embed.EphemeralBaseDir;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Example {
  public static void main(String... args) throws Exception {
    EphemeralBaseDir.tmpDir().use(baseDir -> {
      baseDir.write("some.text", "foo");

      EmbeddedApp.of(s -> s
        .serverConfig(c -> c.baseDir(baseDir.getRoot()))
        .handlers(c -> c
          .get("f", ctx -> ctx.render(ctx.file("some.text")))
        )
      ).test(httpClient ->
        assertEquals("foo", httpClient.getText("f"))
      );

    });
  }
}

Context.file() によって返されたファイルが存在しない場合、404 が発行されます。

レスポンスにはタイムスタンプが付けられ、 Chain.files() メソッドについて説明したものとまったく同じ方法で圧縮されます。

3.12 資産パイプラインを使用した高度な資産の提供

Asset Pipeline プロジェクトは、Ratpack との統合を提供します。これにより、高度な資産のバンドル、コンパイル、提供が可能になります。