8 个稳定版本
2.2.3 | 2024 年 6 月 28 日 |
---|---|
2.2.2 | 2023 年 10 月 8 日 |
2.2.1 | 2023 年 4 月 6 日 |
2.2.0 | 2023 年 2 月 3 日 |
0.1.0 | 2022 年 10 月 21 日 |
#43 in HTTP 服务器
2,656 每月下载量
1.5MB
511 行
Rust Embed 响应器 for Actix Web
用于在服务器中提供嵌入文件的 Actix Web 响应器。您可以将文件嵌入到您的服务器中,然后使用此响应器从您的服务器中提供它们。例如,您可以有一个 Web 应用程序提供其自身的资产、html、css、javascript 文件等。
此 crate 实现了对 rust embed 的响应器,以及一个更高效的分支 rust-embed-for-web。
使用方法
首先,将此 crate 和 rust-embed
或 rust-embed-for-web
添加到您的 Cargo.toml
。
[dependencies]
actix-web = "4.2"
rust-embed = "6.4" # or rust-embed-for-web = "11.1"
actix-web-rust-embed-responder = "2.1.1"
然后,设置您的嵌入和处理器,并添加您的响应器。
use actix_web::{route, web, App, HttpServer};
use actix_web_rust_embed_responder::{EmbedResponse, IntoResponse};
use rust_embed::{EmbeddedFile, RustEmbed};
#[derive(RustEmbed)]
#[folder = "path/to/assets/"]
struct Embed;
// This responder implements both GET and HEAD
#[route("/{path:.*}", method = "GET", method = "HEAD")]
// The return type is important, that is the type for this responder
async fn serve_assets(path: web::Path<String>) -> EmbedResponse<EmbeddedFile> {
// This is not required, but is likely what you want if you want this
// to serve `index.html` as the home page.
let path = if path.is_empty() {
"index.html"
} else {
path.as_str()
};
// There are implementations of `.into_response()` for both `EmbeddedFile` and `Option<EmbeddedFile>`.
// With `Option<EmbeddedFile>`, this responder will also handle sending a 404 response for `None`.
// If you want to customize the `404` response, you can handle the `None` case yourself: see the
// `custom-404.rs` test for an example.
Embed::get(path).into_response().
}
#[actix_web::main] // or #[tokio::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(serve_assets))
.bind(("127.0.0.1", 8080))?
.run()
.await
}
关于 rust-embed-for-web
分支的说明
此分支预先计算某些内容,例如用于响应的头部值。它还可以提前压缩数据。这可能会显著增加编译二进制文件的大小,但作为交换,可以显著提高性能。您可以选择禁用预压缩,这将最小化增加(有关详细信息,请参阅 rust-embed-for-web
的说明)。
为了这些限制,您将获得改进的性能。根据某些基准测试,使用此分支的速度可以提高 16% 到 35%。有关更详细的信息,请查看 基准测试报告。
压缩
使用 rust-embed-for-web
,如果为嵌入启用了压缩(您没有添加 #[gzip = false]
和 #[br = false]
),并且实际提供的文件可以从压缩中受益,此 crate 将为支持它们的客户端提供压缩响应。
使用 rust-embed
,默认情况下不会提供压缩后的响应。但是,您可以设置 .use_compression(Compress::Always)
来启用它。如果这样做,文件将在运行时压缩并缓存。这将始终压缩文件,即使是像图像文件这样不太可能从压缩中受益的文件。
Embed::get(path).into_response().use_compression(Compress::Always)
对于 rust-embed-for-web
,如果您已通过 #[gzip = false]
和 #[br = false]
禁用了预压缩,您也可以使用 Compress::Always
来启用即时压缩。或者,您可以使用 Compress::IfWellKnown
,这将仅压缩已知可压缩的文件,如html、css和javascript。您还可以使用 Compress::Never
完全禁用压缩。
自定义响应
Actix-web 内置了您可以使用的响应自定义功能。
#[route("/{path:.*}", method = "GET", method = "HEAD")]
async fn handler(
path: web::Path<String>,
) -> CustomizeResponder<EmbedResponse<EmbeddedFile>> {
EmbedRE::get(path)
.into_response()
.customize()
.insert_header(("X-My-Header", "My Header Value"))
}
示例
在 示例文件夹 中提供了 rust-embed
和 rust-embed-for-web
的示例。您可以通过使用 cargo run --example rust_embed --release
或 cargo run --example rust_embed_for_web --release
来运行这些示例,然后在您的浏览器中访问 localhost:8080
。
功能
默认情况下,此软件包同时启用了对 rust-embed
和 rust-embed-for-web
的支持。您可以选择禁用您未使用的支持。
# If you are using `rust-embed`:
actix-web-rust-embed-responder = { version = "2.1.1", default-features = false, features = ["support-rust-embed"] }
# If you are using `rust-embed-for-web`:
actix-web-rust-embed-responder = { version = "2.1.1", default-features = false, features = ["support-rust-embed-for-web"] }
还有一个名为 always-embed
的功能标志,默认情况下是禁用的。这仅适用于测试,您可以忽略此功能。
与 actix-plus-static-files
相比
- 此软件包在具有
If-None-Match
和If-Unmodified-Since
标头的304 Not Modified
响应的同时发送时,同时处理actix-plus-static-files
仅支持If-None-Match
。 - 此软件包支持使用
rust-embed-for-web
进行预先压缩或在传输中使用rust-embed
进行压缩。 - 此软件包使用 base85 与
rust-embed-for-web
和 base64 与rust-embed
一起用于ETag
,这比actix-plus-static-files
使用的十六进制编码更节省空间。 - 这个crate仅是用于处理
EmbeddedFile
类型的响应器,您可以将它添加到您的处理器中,而actix-plus-static-files
则实现了一个可以直接添加到您应用程序中的服务。 actix-plus-for-web
实现了If-Any-Match
条件请求,而这个crate没有。这些通常不用于GET
和HEAD
请求。
贡献者
杨恒飞 💻 |
马特·帕尔默 💻 |
依赖项
~24–37MB
~797K SLoC