iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
Software Development

Rust的多方面運用系列 第 25

[Day25] Rocket 序列化和反序列化以及 POST (Part 2)

那麼昨天既然講完了 get
那麼今天就來 post 一下
為了做到後端的功能 所以本次會以 Json 為傳輸格式


在 Rust 中有一個名為 serde 的框架能夠將資料序列化或是反序列化
那麼序列化就是存在於記憶體的資料保存下來的操作
像是使用 Struct 就是一種方式,又或者說將 Struct 轉換成 Json 也是一種將序列化的形式
反序列化 則反 就是轉換成現在使用的形式
那麼 當使用 serde 時需要在 struct 上方標記 #[derive(Serialize, Deserialize)]
Serialize 就是序列化的英文 Deserialize 是反序列化的英文
那麼記得要 extern crate serde
並且 use serde::{Serialize, Deserialize};

在 Rocket 中 post 的用法會是像是

#[post("/get_in")]
fn inside()  {
    
}

這樣
那 基本上不可能會不帶參數
所以我們這裡以 Json 為例

#[derive(Serialize, Deserialize)]
struct User {
    username: String,
    password: String,
}

#[post("/get_in", format = "json", data = "<user>")]
fn inside(user: rocket::serde::json::Json<User>) {

}

可以看到說上面是 struct 主要用來接收 Json
要記得的是
post 的 json 內容一定要跟上面 struct 的格式一樣
我不確定其他套件是不是也要這樣
然後 後面 data 指向打算要傳入的變數名稱
那麼由於我是使用 Rocket 他的測試版 所以是無法使用一個名為
rocket_contrib 的套件的
那麼上面我寫的例子其實是跑不起來的
因為 Json 這個是 Rocket 中的一個 feature

rocket = { version = "0.5.0-rc.1", features = ["json"] }
serde = "1.0.130"

我們的 Cargo.toml 檔案應該會長這樣
那麼實際運用看看吧

use rocket::serde::json::Json;

#[derive(Serialize, Deserialize)]
pub struct User {
    username: String,
    student_id: String,
    path: i32,
}

#[post("/get_in", format = "json", data = "<user>")]
fn inside(user: Json<User>) -> Json<User> {
    let username = user.username.clone();
    let student_id = user.student_id.clone();
    let path = user.path.clone();
    Json(User{
        username,
        student_id,
        path
    })
}

上面的話我構造了一個函數 並且會傳入 Json
這邊的話有一個 Struct 技巧我有少講
就是如果說你設定的變數跟 Struct 裡頭元素的名稱一樣時
可以直接填入
OK 那我們可以看到上面的 因為傳回來的資料還是具有所有權
所以我們直接 clone 下來
並且回傳一個一樣的 Json 回去

好 我們先 cargo run 起來
這邊使用 IDEA 的工具測試

POST http://localhost:8000/get_in
Content-Type: application/json

{
  "username": "SFeather",
  "student_id": "910629",
  "path": 5
}

可以看到 這樣就成功傳入了
那麼測試完之後 如果想要回傳狀態碼
Rocket 也有內建
use rocket::http::Status;
然後將下方回傳值部份改成
Status::Accepted


好 今天就到這邊 明天我們來實做一下


上一篇
[Day24] Rocket Web 框架 (Part 1)
下一篇
[Day26] 用 Rocket 做一個圖書館門禁後端 (Part 3)
系列文
Rust的多方面運用30

尚未有邦友留言

立即登入留言