Web开发

首页 » 常识 » 预防 » RustWeb开发ActixWeb使
TUhjnbcbe - 2024/9/1 16:38:00

随着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

1
查看完整版本: RustWeb开发ActixWeb使