Rust 上的 API,错误:“超出数据限制”

API on Rust, error: "data limit exceeded"

提问人:Duxtaa 提问时间:7/9/2023 最后编辑:Duxtaa 更新时间:7/10/2023 访问量:117

问:

我需要在 Rust 上创建一个 API,你给它一个字符串,它执行一些功能,然后返回一个新字符串。但是发生了错误,如果字符串太长,则会发生错误:

POST /test:
   >> Matched: (test) POST /test
   >> Data guard `String` failed: Custom { kind: UnexpectedEof, error: "data limit exceeded" }.
   >> Outcome: Failure
   >> No. 400 catcher registered. Using Rocket default.
   >> Response succeeded.

Rust 代码:


#[macro_use] extern crate rocket;
#[macro_use] extern crate serde_json;

#[get("/")]
fn index() -> String {
    json!({"message": "Hello, world!"}).to_string()
}

#[post("/test", data = "<data>")]
fn test(data: String) -> String {
    json!({"data": data}).to_string()
}

#[launch]
fn rocket() -> _ {
    rocket::build().mount("/", routes![index, test])
}

cargo.toml:

[dependencies]
rocket = "0.5.0-rc.3"
serde_json = "1.0.64"
rocket_sync_db_pools = "0.1.0-rc.3"
serde = { version = "1.0", features = ["derive"] }
rocket_contrib = "0.4.11"

我试图用 ChatGPT 和困惑 ai 解决问题,但它们没有帮助

Rust Serde-JSON 火箭

评论


答:

2赞 kmdreko 7/9/2023 #1

您可以根据 rocket.toml 中的传入数据类型配置限制,如下所示:

[default.limits]
form = "64 kB"
json = "1 MiB"
msgpack = "2 MiB"
"file/jpg" = "5 MiB"

有关详细信息,请参阅《Rocket 编程指南》中的配置。这里还有内置限制


在您的例子中,您正在使用 ,它将映射到默认为 8KiB 的限制。奇怪的是,您没有使用 Json 类型,除了默认情况下具有更高的限制外,它还会为您处理序列化和反序列化,但每个类型都有自己的限制。String"string"

因此,您可以执行以下操作(根据需要升高或降低):

[default.limits]
string = "1 MiB"

评论

0赞 Duxtaa 7/9/2023
我找不到rocket.toml文件。我应该创建它吗?
0赞 kmdreko 7/9/2023
@DuxtaEgor是的。
0赞 Duxtaa 7/9/2023
非常感谢,它奏效了!
0赞 user1013364 7/10/2023 #2

可能与 https://api.rocket.rs/v0.4/rocket/config/struct.Limits.html 有关,如果您要发布巨大的 json 字符串(火箭默认设置为 >32KiB)。

要增加正文大小限制,请更改为fn rocket()

use rocket::{
    config::{Environment, Limits},
    Config,
};

fn main() {
    let conf = Config::build(Environment::Development)
        .limits(Limits::new().limit("forms", 1048576 * 1024))
        .unwrap();

    rocket::custom(conf)
        .mount(...)
        .launch();
}