0%

actix-web 中间件教程(2)

wrap_fn 方法使用
wrap_fn 允许你以一种简洁的方式,将一个闭包转化为 Transform 类型,并且返回一个能够被 Actix Web 中间件使用的 Service。这个闭包可以接受请求,并返回一个响应。它的作用是简化实现自定义中间件的过程。

修改请求头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use actix_web::{
dev::Service,
http::header::{self, HeaderName, HeaderValue},
web, App, HttpResponse, HttpServer, Responder,
};
use futures::FutureExt;
use serde_json::json;

//index
async fn index() -> impl Responder {
HttpResponse::Ok().json(json!({
"code": 1,
"message":"请求完成!",
"data": "index"
}))
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.route("/", web::get().to(index))
.wrap_fn(|req, srv| {
srv.call(req).map(move |mut res| {
// 修改头部信息
res.as_mut()
.unwrap()
.headers_mut()
.insert(header::SERVER, HeaderValue::from_static("wcharServer"));
//cus-header 自定义头
res.as_mut()
.unwrap()
.headers_mut()
.insert(HeaderName::from_static("cus-header"), HeaderValue::from_static("are you ok?"));

res
})
})
})
.bind("127.0.0.1:8080")?
.run()
.await
}

修改头部

打印请求信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.wrap_fn(|req, srv| {
let path = req.path().to_string();
let method = req.method().clone();
let start_time = std::time::Instant::now();

srv.call(req).map(move |res| {
let duration = start_time.elapsed();
if let Ok(ref resp) = res {
println!(
"[{}] {} => {} ({}ms)",
method,
path,
resp.status(),
duration.as_millis()
);
}
res
})
})

请求信息