前置工作

安裝依賴套件

# Cargo.toml
[dependencies.rocket_contrib]
version = "0.4.5"
default-features = false
features = ["json"]

[dependencies.serde]
version = "1.0"
features = ["derive"]

處理 JsonRequest 並回傳 JsonResponse

use rocket_contrib::json::Json;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
struct User {
	username: String,
    password: String,
    // 可選的欄位,可送可不送
    email: Optional<Email>
}

#[post("/users", format = "json", data = "<user>")]
fn create_user(user: Json<User>) -> Json<User> {
    // 假設在這裡把傳上來的資料寫入資料庫
    
    // 另外在這裡要注意的是,因為 
    // user.username
    // user.password
    // user.email
    // 這些變數的 ownership 屬於 user 不能直接透過賦值移動 ownership
    // 所以這裡需要使用 clone() 函數來複製一個 instance。
    let username = user.username.clone();
    let password = user.password.clone();
    let mut email : Option<String> = user.email.clone();
    
    // 回傳 Json Response
    return Json(User{
        username, // username: username 的簡短寫法
        password, // password: password 的簡短寫法
        email, // email: email 的簡短寫法
    });
}

fn main() {
    rocket::ignite().mount("/", routes![
        create_user
    ]).launch();
}

以上就是 Json Request 以及 Json Response 的實例

題外話

有時候我們會需要把收到的 Json Request 的內容輸出到 Terminal 上面,方便開發,這時候我們只要把struct改寫成:

use std::fmt::Debug;

#[derive(Debug, Serialize, Deserialize)]
struct User {
    username: String,
    password: String,
    email: Option<String>
}

加入std::fmt::Debug以及#derive(Debug)後在想要輸出的地方寫上:

println!("{:?}", user);