那麼昨天既然講完了 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
好 今天就到這邊 明天我們來實做一下