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 的集成。这提供了高级资产捆绑、编译和服务。