提取器
提取器是用来提取用户传来的参数的捏,提取器本身框架是传给处理函数的参数捏。
rust
use axum::{
routing::{get, post},
extract::{Path, Query, Json},
Router,
};
use serde_json::Value;
use std::collections::HashMap;
use std::net::SocketAddr;
// 先用框架自带的函数`Path`反序列化 拿到获取路径参数捏
async fn path(Path(user_id): Path<u32>) {
println!("用户ID: {}", user_id);
}
// `Query` 用于获取查询参数并对其进行反序列化
async fn query(Query(params): Query<HashMap<String, String>>) {
println!("查询参数: {:?}", params);
}
// 缓冲请求体并将其作为JSON反序列化为 `serde_json::Value`
// `Json` 支持任何实现了 `serde::Deserialize` 的类型
async fn json(Json(payload): Json<Value>) {
println!("JSON payload: {:?}", payload);
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/user/:user_id", get(path))
.route("/query", get(query))
.route("/json", post(json));
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
axum::serve(app, addr).await.unwrap();
}常见提取器
rust
use axum::{
extract::{Request, Json, Path, Extension, Query},
routing::post,
http::header::HeaderMap,
body::{Bytes, Body},
Router,
};
use serde_json::Value;
use std::collections::HashMap;
// `Path` 用于获取路径参数并对其进行反序列化。更多细节见其文档说明
async fn path(Path(user_id): Path<u32>) {}
// `Query` 用于获取查询参数并对其进行反序列化
async fn query(Query(params): Query<HashMap<String, String>>) {}
// `HeaderMap` 用于获取所有请求头
async fn headers(headers: HeaderMap) {}
// `String` 会消费请求体并确保其为有效UTF-8编码
async fn string(body: String) {}
// `Bytes` 用于获取原始请求体数据
async fn bytes(body: Bytes) {}
// 我们已经了解过`Json`用于将请求体解析为JSON格式
async fn json(Json(payload): Json<Value>) {}
// `Request` 用于获取完整请求以实现最大控制能力
async fn request(request: Request<Body>) {}
// `Extension` 从"请求扩展"中提取数据
// 这通常用于在处理器之间共享状态
async fn extension(Extension(state): Extension<State>) {}
#[derive(Clone)]
struct State { /* ... */ }
let app = Router::new()
.route("/path/{user_id}", post(path))
.route("/query", post(query))
.route("/string", post(string))
.route("/bytes", post(bytes))
.route("/json", post(json))
.route("/request", post(request))
.route("/extension", post(extension));