随着Rust语言的流行,很多人已经了解到Rust是一个安全高效的系统语言。但是你不知道的是,Rust也是一门优秀的Web开发语言,适合各种Web系统、网站、微服务、API接口开发等任务。
今天我们就介绍一个Rust的Web框架ActixWeb来证明Rust的Web开发也不是什么难事。
概述ActixWeb最初来源于其同名的Actor框架,目前Actix已经不咋流行,只用于于websocket。ActixWeb则发展壮大成了RustWeb后端生态系统中最受欢迎的框架之一。
由于天生来自于actor的基因,Actixweb框架有actor的各种优势,支持高并发、高性能、高可靠性的Web应用程序开发体验。
入门
首先,需要使用cargoinitexample-api生成项目,cd进入文件夹,然后使用以下命令添加actix-web打包到项目中:
cargoaddactix-web
至此,你的准备工作已经完成。
我们先来复制一个模板文件以直接来修改一个“HelloChongchong”Web应用作为第起点:
useactix_web::{web,App,HttpServer,Responder};
#[get("/")]
asyncfnindex()-implResponder{
"HelloChongchong!"
}
#[actix_web::main]
asyncfnmain()-std::io::Result(){
HttpServer::new(
{
App::new().service(
web::scope("/")
.route("/",web::get().to(index)),
)
})
.bind((".0.0.1",))?
.run()
.await
}
路由使用Web框架的第一步就是撰写路由,ActixWeb当然也是如此。大多数actix_web::Responder返回特征可以路由。例如“HelloChongchong”示例中的:
#[get("/")]
asyncfnindex()-implResponder{
"HelloChongchong!"
}
可以将该处理函数输入到actix_web::App然后作为参数传递给HttpServer:
#[actix_web::main]
asyncfnmain()-std::io::Result(){
HttpServer::new(
{
App::new().service(
web::scope("/")
.route("/index.html",web::get().to(index)),
)
})
.bind((".0.0.1",))?
.run()
.await
}
这样每次访问/index.html,就会返回“HelloChongchong!”。但是,如果想创建多个迷你路由器类型,然后最后将它们全部合并到应用程序中,可能会发现这种方法太繁琐了。
为了处理他们,需要ServiceConfig:
useactix_web::{web,App,HttpResponse};
fnconfig(cfg:mutweb::ServiceConfig){
cfg.service(web::resource("/test")
.route(web::get().to(
HttpResponse::Ok()))
.route(web::head().to(
HttpResponse::MethodNotAllowed()))
);
}
#[actix_web::main]
asyncfnmain()-std::io::Result(){
HttpServer::new(
{
App::new().configure(config)
})
.bind((".0.0.1",))?
.run()
.await
}
ActixWeb中的提取器正是这样的:类型安全的请求实现,当传递到处理函数时,将尝试从处理函数的请求中提取相关数据。例如,actix_web::web::Jsonextractor将尝试从请求正文中提取JSON。然而,要成功反序列化JSON,需要使用serde板条箱,同时也使用derive为我们的结构添加自动反序列化和序列化派生宏的函数。可以通过执行以下命令来安装serde:
cargoaddserde-Fderive
现在可以将它用作派生宏,如下所示:
useactix_web::web;
useserde::Deserialize;
#[derive(Deserialize)]
structInfo{
username:String,
}
#[post("/submit")]
asyncfnsubmit(info:web::JsonInfo)-String{
format!("Wel