全书目录

第四十四篇:Rocket 完全指南 —— 火箭发射控制塔宇宙

第十章:JSON、表单与数据载荷 —— 火箭装载单不能随手拼

1 分钟 218 字 第 819 / 962 个阅读单元

现实项目里,请求当然不只是路径和 query。

还有:

  • JSON body
  • 表单
  • 文件
  • 原始 data

Rocket 对这些也有明确主路径。

#1. JSON

rust
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. 表单

rust
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 自己重做一遍装载检查。