Ответ строкой формата в Rust
Не только тело запроса, но и ответ можно собрать из структуры. Обертка над типом говорит библиотеке записать поля в строку формата и выставить заголовок содержимого.
Нужны те же крейты, что и для разбора тела: пометка над структурой и модуль строки формата. Если зависимости уже есть в проекте, повторно их не добавляют.
Вернем профиль пользователя строкой формата из обработчика чтения:
use axum::{Json, Router, routing::get};
use serde::Serialize;
#[derive(Serialize)]
struct Profile {
name: String,
score: i32,
}
async fn profile() -> Json<Profile> {
Json(Profile {
name: String::from("ann"),
score: 10,
})
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/profile", get(profile));
let listener = match tokio::net::TcpListener::bind("127.0.0.1:3000").await {
Ok(l) => l,
Err(e) => {
eprintln!("{}", e);
return;
}
};
match axum::serve(listener, app).await {
Ok(()) => {}
Err(e) => eprintln!("{}", e),
}
}
Ответ содержит {"name":"ann","score":10}.
Клиент получает готовый объект без
ручной сборки текста.
Список значений тоже можно обернуть и отдать одним массивом:
use axum::{Json, Router, routing::get};
use serde::Serialize;
#[derive(Serialize)]
struct Tag {
label: String,
}
async fn tags() -> Json<Vec<Tag>> {
Json(vec![
Tag {
label: String::from("a"),
},
Tag {
label: String::from("b"),
},
])
}
#[tokio::main]
async fn main() {
let app = Router::new().route("/tags", get(tags));
let listener = match tokio::net::TcpListener::bind("127.0.0.1:3000").await {
Ok(l) => l,
Err(e) => {
eprintln!("{}", e);
return;
}
};
match axum::serve(listener, app).await {
Ok(()) => {}
Err(e) => eprintln!("{}", e),
}
}
Дан путь:
/status
Верните объект с полем ok
типа логического значения true.
Дана структура:
struct Point {
x: i32,
y: i32,
}
Подключите сборку, отдайте точку
1 и 2 и назовите ключи
в строке ответа.
Скажите, чем ответ с оберткой над структурой отличается от возврата готовой строки текста.