gpt4 book ai didi

rust - 使用函数装饰时,如何将 App 数据传递给 actix-web 中的服务路由处理函数?

转载 作者:行者123 更新时间:2023-11-29 08:28:15 36 4
gpt4 key购买 nike

我在文档中找到了一个示例,说明如何创建全局状态,由 Mutex 保护,在处理线程之间共享,供所有路由处理程序使用。完美的!但是,我更喜欢使用附加到我的函数的属性来连接我的路由处理程序。我不知道使用属性函数并传入全局状态的语法(如果允许的话)。

这是 actix-web 文档中的示例,来自 https://docs.rs/actix-web/1.0.2/actix_web/web/struct.Data.html

use std::sync::Mutex;
use actix_web::{web, App};

struct MyData {
counter: usize,
}

/// Use `Data<T>` extractor to access data in handler.
fn index(data: web::Data<Mutex<MyData>>) {
let mut data = data.lock().unwrap();
data.counter += 1;
}

fn main() {
let data = web::Data::new(Mutex::new(MyData{ counter: 0 }));

let app = App::new()
// Store `MyData` in application storage.
.register_data(data.clone())
.service(
web::resource("/index.html").route(
web::get().to(index)));
}

注意路由处理程序如何命名为 index正在通过 web::Data .

下面是我的一些代码片段。

use actix_web::{get, App, HttpResponse, HttpServer, Responder};
pub mod request;
pub mod routes;

const SERVICE_NAME : &str = "Shy Rules Engine";
const SERVICE_VERSION : &str = "0.1";

#[get("/")]
fn index() -> impl Responder {
HttpResponse::Ok().body(format!("{} version {}", SERVICE_NAME, SERVICE_VERSION))
}

mod expression_execute {

#[post("/expression/execute")]
fn route(req: web::Json<ExpressionExecuteRequest>) -> HttpResponse {

// ... lots of code omitted ...

if response.has_error() {
HttpResponse::Ok().json(response)
}
else {
HttpResponse::BadRequest().json(response)
}
}

}

pub fn shy_service(ip : &str, port : &str) {
HttpServer::new(|| {
App::new()
.service(index)
.service(expression_execute::route)
})
.bind(format!("{}:{}", ip, port))
.unwrap()
.run()
.unwrap();
}

注意我是如何调用方法 App::service 的连接我的路线处理程序。

另请注意我的路由处理程序如何不接收全局状态(因为我尚未将其添加到我的应用程序中)。如果我使用与使用 register_data 的文档类似的模式要创建全局应用程序数据,我要对我的方法签名 get 做哪些更改?和 post属性和其他任何东西,以便我可以将该全局状态传递给处理程序?

或者不能使用 getpost访问全局状态的属性?

最佳答案

你列出的两种情况确实没有太大区别:

//# actix-web = "1.0.8"
use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};
use std::sync::Mutex;

const SERVICE_NAME : &str = "Shy Rules Engine";
const SERVICE_VERSION : &str = "0.1";

struct MyData {
counter: usize,
}

#[get("/")]
fn index(data: web::Data<Mutex<MyData>>) -> impl Responder {
let mut data = data.lock().unwrap();
data.counter += 1;
println!("Endpoint visited: {}", data.counter);
HttpResponse::Ok().body(format!("{} version {}", SERVICE_NAME, SERVICE_VERSION))
}

pub fn shy_service(ip : &str, port : &str) {
let data = web::Data::new(Mutex::new(MyData{ counter: 0 }));

HttpServer::new(move || {
App::new()
.register_data(data.clone())
.service(index)
})
.bind(format!("{}:{}", ip, port))
.unwrap()
.run()
.unwrap();
}

fn main() {
shy_service("127.0.0.1", "8080");
}

您可以通过简单地 curl http 端点来验证它是否有效。对于 multiple extractors ,你必须使用元组:

    #[post("/expression/execute")]
fn route((req, data): (web::Json<ExpressionExecuteRequest>, web::Data<Mutex<MyData>>)) -> HttpResponse {
unimplemented!()
}

关于rust - 使用函数装饰时,如何将 App 数据传递给 actix-web 中的服务路由处理函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58436748/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com