本手册尚未完善,目前正在开发中。
如果您想帮助改进它,我们希望您能做到,请参阅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 “资产管道”高级资产服务

资产管道项目提供了与 Ratpack 的集成。这提供了高级资产捆绑、编译和服务。