现实项目里,请求当然不只是路径和 query。
还有:
- JSON body
- 表单
- 文件
- 原始 data
Rocket 对这些也有明确主路径。
#1. JSON
use rocket::serde::{Deserialize, Serialize, json::Json};
#[derive(Debug, Deserialize)]
#[serde(crate = "rocket::serde")]
struct CreateLaunch {
mission: String,
rocket: String,
}
#[derive(Debug, Serialize)]
#[serde(crate = "rocket::serde")]
struct LaunchView {
id: u64,
mission: String,
rocket: String,
}
#[post("/launches", data = "<input>")]
fn create_launch(input: Json<CreateLaunch>) -> Json<LaunchView> {
Json(LaunchView {
id: 1,
mission: input.mission.clone(),
rocket: input.rocket.clone(),
})
}data = "<input>" 就像:
这次发射要带一份装载清单,框架会按声明把它递交给对应检查流程。
#2. 表单
use rocket::form::FromForm;
use rocket::form::Form;
#[derive(FromForm)]
struct LoginForm {
username: String,
password: String,
}
#[post("/login", data = "<form>")]
fn login(form: Form<LoginForm>) -> String {
format!("welcome {}", form.username)
}Rocket 的感觉一直很统一:
- 你声明载荷位置
- 你声明载荷结构
- 框架按结构去验和提取
而不是在 handler 里拿一坨原始 body 自己重做一遍装载检查。