Rocket.rs 初探 - Json Request 和 Json Response
在這篇文章中,將 Rocket.rs 中如何接收 JSON Request 以及 Json Response 的範例筆記下來。 另外還有如何在 Server-Side 將 Json 直接透過 println! 輸出。
前置工作
安裝依賴套件
# 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);