我正在try 使用Axum 0.7和lambda_http 0.9创建一个非常简单的API

[package]
name = "api"
version = "0.1.0"
edition = "2021"

[dependencies]
axum = "0.7"
chrono = { version = "0.4" }
cookie = { version = "0.18" }
lambda_http = { version = "0.9" }
serde = "1.0"
serde_json = "1.0"
askama = { version = "0.12.1" }
tokio = { version = "1.35", features = ["macros"] }
tower-http = { version = "0.5", features = ["compression-full", "cors"] }
tracing = { version = "0.1", features = ["log"] }
tracing-subscriber = { version = "0.3", default-features = false, features = [
    "fmt",
] }
use axum::{
    http::{
        header::{ACCEPT, ACCEPT_ENCODING, AUTHORIZATION},
        Method,
    },
    routing::{get, post},
    Router,
};
use lambda_http::{run, Error};
use tower_http::{compression::CompressionLayer, cors::CorsLayer};


pub async fn get_index(request: Request) -> (StatusCode, Html<String>) {
    info!("-> {}", request.uri());
    info!("<- get_index");
    (StatusCode::OK, Html("<h1>/</h1>".to_string()))
}


#[tokio::main]
async fn main() -> Result<(), Error> {
    let comression_layer: CompressionLayer = CompressionLayer::new()
        .br(true)
        .deflate(true)
        .gzip(true)
        .zstd(true);

    let app: Router = Router::new()
        .route("/", get(get_index))
        .layer(comression_layer)
        .fallback(not_found);


当我在本地测试该服务时(使用Cargo lambda),我得到以下结果:

❯ curl -H "Accept-Encoding: gzip, deflate, br" -i http://127.0.0.1:9000/
HTTP/1.1 200 OK
content-type: text/html; charset=utf-8
content-length: 10
access-control-allow-credentials: true
vary: origin
vary: access-control-request-method
vary: access-control-request-headers
date: Sun, 24 Dec 2023 21:17:29 GMT

<h1>/</h1>⏎

我是否遗漏了一些微不足道的东西,或者API应该返回压缩内容?

推荐答案

我查看了CompressionLayer->;CompressionLayer::compress_when->;Compression::compress_when->;DefaultPredicate的文档:

这将压缩响应,除非:

  • ...
  • 响应少于32个字节.

你的好像是11个字节.您可以使用closure or function作为谓词来重写它以测试它是否工作,它应该看起来像这样:

let comression_layer: CompressionLayer = CompressionLayer::new()
    .br(true)
    .deflate(true)
    .gzip(true)
    .zstd(true)
    .compress_when(|_, _, _, _| true);

或者你可以只发送一个更大的回复.


HTTP side上,只要没有明确禁止,服务器就可以使用identity编码(无压缩).因此,您可以try 使用这个cURL命令来要求压缩:

curl -H "Accept-Encoding: gzip, deflate, br, identity;q=0" -i http://127.0.0.1:9000/

Rust相关问答推荐

如何从polars DataFrame中获取一个列作为Option String?<>

如何处理动态 struct 实例化?

何时可以在Rust中退出异步操作?

有没有更好的方法从HashMap的条目初始化 struct ?

这个规则关于或模式到底是什么意思?如果表达片段的类型与p_i|q_i...&q;不一致,就会形成

用 rust 蚀中的future 展望 struct 的future

为什么`AlternateScreen`在读取输入键时需要按Enter键?

更合理的方法来设计样条线函数器?

Rust将String上的迭代器转换为&;[&;str]

为什么特征默认没有调整大小?

为什么实现特征的对象期望比具体对象有更长的生命周期?

在没有任何同步的情况下以非原子方式更新由宽松原子操作 Select 的值是否安全?

无法将`&Vec>`转换为`&[&str]`

有什么方法可以通过使用生命周期来减轻嵌套生成器中的当生成器产生时borrow 可能仍在使用错误?

一个函数调用会产生双重borrow 错误,而另一个则不会

Rust 函数指针似乎被borrow 判断器视为有状态的

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

Abortable:悬而未决的期货?

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?