如何在 actix_web 示例代码中提取变量?
How to extract variable in actix_web example code?
这是来自其主页的 actix_web 示例代码:
use actix_web::{web, App, Responder, HttpServer};
fn index(info: web::Path<(String, u32)>) -> impl Responder {
format!("Hello {}! id:{}", info.0, info.1)
}
fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(
web::resource("/{name}/{id}/index.html").to(index))
)
.bind("127.0.0.1:8080")?
.run()
}
我试图通过为 web::resource...
行提取一个变量来重构代码:
use actix_web::{web, App, HttpServer, Responder};
fn index(info: web::Path<(u32, String)>) -> impl Responder {
format!("Hello {}! id:{}", info.1, info.0)
}
fn main() -> std::io::Result<()> {
let route = web::resource("/{id}/{name}/index.html").to(index);
HttpServer::new(|| App::new().service(route))
.bind("127.0.0.1:8080")?
.run()
}
但是编译失败。为什么失败了?以及如何在这里提取该变量?谢谢
问题是服务需要在多线程环境中独占。通常你会克隆它,但正如你所注意到的,actix_web::resource::Resource
没有实现 std::clone::Clone
。一种方法是自己实现这个特性并调用克隆。
一个更简单的解决方法是使用闭包:
fn main() -> std::io::Result<()> {
let route = || web::resource("/{id}/{name}/index.html").to(index);
HttpServer::new(move || {
App::new().service(route())
})
.bind("127.0.0.1:8080")?
.run()
}
您也可以使用 this 方法,这可能是您想要在外部提取变量的原因。
这是来自其主页的 actix_web 示例代码:
use actix_web::{web, App, Responder, HttpServer};
fn index(info: web::Path<(String, u32)>) -> impl Responder {
format!("Hello {}! id:{}", info.0, info.1)
}
fn main() -> std::io::Result<()> {
HttpServer::new(|| App::new().service(
web::resource("/{name}/{id}/index.html").to(index))
)
.bind("127.0.0.1:8080")?
.run()
}
我试图通过为 web::resource...
行提取一个变量来重构代码:
use actix_web::{web, App, HttpServer, Responder};
fn index(info: web::Path<(u32, String)>) -> impl Responder {
format!("Hello {}! id:{}", info.1, info.0)
}
fn main() -> std::io::Result<()> {
let route = web::resource("/{id}/{name}/index.html").to(index);
HttpServer::new(|| App::new().service(route))
.bind("127.0.0.1:8080")?
.run()
}
但是编译失败。为什么失败了?以及如何在这里提取该变量?谢谢
问题是服务需要在多线程环境中独占。通常你会克隆它,但正如你所注意到的,actix_web::resource::Resource
没有实现 std::clone::Clone
。一种方法是自己实现这个特性并调用克隆。
一个更简单的解决方法是使用闭包:
fn main() -> std::io::Result<()> {
let route = || web::resource("/{id}/{name}/index.html").to(index);
HttpServer::new(move || {
App::new().service(route())
})
.bind("127.0.0.1:8080")?
.run()
}
您也可以使用 this 方法,这可能是您想要在外部提取变量的原因。