小编Pan*_*ain的帖子

如何使 axum 路由器句柄返回不同的内容类型响应?

例如,当用户访问时http://127.0.0.1:8080/hello,如果查询参数id为1,则返回纯文本响应。如果id是2,给出一个json结构。

概括:

id(输入) 状态码 内容类型 身体
1 200 应用程序/json {“名称”:“世界”}
2 400 文本/纯文本 没有这样的人
struct HelloParam {
    id: u16,
}

struct HelloResponse {
    name: String,
}

async fn hello_get(Query(params): Query<HelloParam>) -> Response {
    // how to implement it? 
}

let router= Router::new().route("/hello", get(hello_get));

Run Code Online (Sandbox Code Playgroud)

hyper rust-axum

7
推荐指数
1
解决办法
1万
查看次数

使用 serde 通过数值作为类型标识符对 json 进行反序列化

我对 Rust 很陌生,并且有 OOP 背景。所以,也许我误解了一些 Rust 基础知识。

我想用 serde 解析固定的 json 结构。该结构代表不同的消息类型之一。每条消息都有一个数字type属性来区分它。各个消息类型的确切结构大多不同,但它们也可以是相同的。

{"type": 1, "sender_id": 4, "name": "sender", ...}
{"type": 2, "sender_id": 5, "measurement": 3.1415, ...}
{"type": 3, "sender_id": 6, "measurement": 13.37, ...}
...
Run Code Online (Sandbox Code Playgroud)

首先,我定义了 aenum来区分消息类型,也struct为每种类型的消息定义了 a ,而没有存储类型的字段。

#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
enum Message {
    T1(Type1),
    T2(Type2),
    T3(Type3),
    // ...
}

#[derive(Debug, Serialize, Deserialize)]
struct Type1 {
    sender_id: u32,
    name: String,
    // ...
}
#[derive(Debug, Serialize, Deserialize)]
struct Type2 {
    sender_id: u32, …
Run Code Online (Sandbox Code Playgroud)

enums rust json-deserialization serde

3
推荐指数
1
解决办法
3397
查看次数

标签 统计

enums ×1

hyper ×1

json-deserialization ×1

rust ×1

rust-axum ×1

serde ×1