提问人:Duxtaa 提问时间:7/9/2023 最后编辑:Duxtaa 更新时间:7/10/2023 访问量:117
Rust 上的 API,错误:“超出数据限制”
API on Rust, error: "data limit exceeded"
问:
我需要在 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 解决问题,但它们没有帮助
答:
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();
}
评论