[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


好 今天就到这边 明天我们来实做一下


<<:  Day 17 - 成长曲线N+1 : AIGO教练培训

>>:  【Day 14】List Comprehension 列表生成式

[Angular] Day29. Internationalization (i18n)

Angular 提供了 i18n 功能让我们开发专案时可以让我们的专案应在不同的国家中被使用,Loc...

DAY25 - 展现成果,建立成果页面

随着专案前端、後端等等各个架构与部署都准备完成,Side project 就差最後一步骤,将自己或别...

[Day29] Vue3 - 事件绑定

在 Javascript 中会用 onclick, onchange...等方式监听 DOM 物件,...

虹语岚访仲夏夜-13(专业的小四篇)

看过的故事有好多 有的很悲 有的很爱 但对於自己 像是吃的午饭 又吐了一半 在这战场 还是不太习惯...

浅谈传输层协定(三):牺牲可靠性换取速度的 UDP

前面两天从 TCP 在做什麽开始聊起,今天来看看另外一个也很重要的协定 UDP。 UDP 为 Use...