有没有推荐的方法来修改接收到的actix-web请求?我正在寻找一种方法来向请求对象添加数据,并使其可用于下游中间件和处理程序进行处理。
中间件文档说:
“Actix-web的中间件系统允许我们向请求/响应处理中添加附加行为。中间件可以钩入传入请求流程,使我们能够修改请求以及停止请求处理以提前返回响应。”
该页面没有关于如何修改请求的示例。
让我们看一下下面的代码(从上面的文档中获取),那么怎么样才能将数据添加到请求中呢?
“Actix-web的中间件系统允许我们向请求/响应处理中添加附加行为。中间件可以钩入传入请求流程,使我们能够修改请求以及停止请求处理以提前返回响应。”
该页面没有关于如何修改请求的示例。
让我们看一下下面的代码(从上面的文档中获取),那么怎么样才能将数据添加到请求中呢?
use std::pin::Pin;
use std::task::{Context, Poll};
use actix_service::{Service, Transform};
use actix_web::{dev::ServiceRequest, dev::ServiceResponse, Error};
use futures::future::{ok, Ready};
use futures::Future;
// There are two steps in middleware processing.
// 1. Middleware initialization, middleware factory gets called with
// next service in chain as parameter.
// 2. Middleware's call method gets called with normal request.
pub struct SayHi;
// Middleware factory is `Transform` trait from actix-service crate
// `S` - type of the next service
// `B` - type of response's body
impl<S, B> Transform<S> for SayHi
where
S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
S::Future: 'static,
B: 'static,
{
type Request = ServiceRequest;
type Response = ServiceResponse<B>;
type Error = Error;
type InitError = ();
type Transform = SayHiMiddleware<S>;
type Future = Ready<Result<Self::Transform, Self::InitError>>;
fn new_transform(&self, service: S) -> Self::Future {
ok(SayHiMiddleware { service })
}
}
pub struct SayHiMiddleware<S> {
service: S,
}
impl<S, B> Service for SayHiMiddleware<S>
where
S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
S::Future: 'static,
B: 'static,
{
type Request = ServiceRequest;
type Response = ServiceResponse<B>;
type Error = Error;
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
self.service.poll_ready(cx)
}
fn call(&mut self, req: ServiceRequest) -> Self::Future {
println!("Hi from start. You requested: {}", req.path());
let fut = self.service.call(req);
Box::pin(async move {
let res = fut.await?;
println!("Hi from response");
Ok(res)
})
}
}
x_common
和x_contrib
? - Vabkalet single_part: Result = Ok(orig_payload);
let in_memory_stream = stream::once(single_part);
let pinned_stream: Pin>>> = Box::pin(in_memory_stream);
let in_memory_payload: Payload = pinned_stream.into();
req.set_payload(in_memory_payload);
Ok(svc.call(req).await?)
- Vabka