【Rust】从0到1开发和运行Web相关功能,并简单实现数据库连接和查询
上一篇文章我们已经学习和了解了Rust编程语言的大概知识点以及常见的应用场景,
因此,本篇文章博主将从Rust的Web开发,从0到1开发并运行Web相关功能,简单实现图片采集并设置系统壁纸。
目录
- 项目搭建
- 项目结构
- 配置文件
- 调整位置
- 构建和运行
- 运行Web
- 切换目录
- 编译与运行
- 查看效果
- 解决乱码
- 操作数据库
- tiberius 库
- 安装依赖
- 基本连接
- 总结
- 文章推荐
项目搭建
项目结构
在我们的项目目录中,需要有以下文件:
你的项目目录/
├── Cargo.toml # 项目配置文件
└── src/└── main.rs # 你的代码文件
配置文件
Cargo.toml是Rust项目的配置文件,采用TOML格式,用于定义项目元数据、依赖关系和构建配置。
核心功能
- 项目元数据:包含名称(name)、版本(version)、Rust版本(edition)等基本信息。 25
- 依赖管理:通过[dependencies]部分声明外部库(crate)及其版本、特性等。 24
- 构建配置:指定编译选项、输出类型(如库或可执行文件)等。 56
关键区别
- Cargo.lock:由Cargo自动生成并维护,记录依赖项的确切版本,确保构建可重复性。 15
示例结构
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"[dependencies]
rand = "0.8"
了解完配置文件大概用途后,我们在与 main.rs 相同的目录中创建 Cargo.toml 文件,内容如下:
[package]
name = "my-actix-app"
version = "0.1.0"
edition = "2021" # 关键:这解决了 async fn 的问题[dependencies]
actix-web = "4.4"
tokio = { version = "1.0", features = ["full"] }
需要特别注意,配置文件里的关键词不能重复,比如,不能出现两次[dependencies]或者tokio
调整位置
如果刚开始只有一个main.rs文件,那么就需要进行文件位置调整,特别是在linux下的话,一般都是用命令操作。
将我们的 main.rs 文件移动到 src 目录下:
# 如果当前目录结构不对,执行这些命令
mkdir src
mv main.rs src/main.rs
构建和运行
在项目根目录(有 Cargo.toml 的目录)中执行:
# 构建项目
cargo build# 运行项目
cargo run
cargo run,这个下载过程可能需要点时间,大概十来分钟,看个人的网络快慢吧,下载的文件会比较多。


如果只出现黄色警告,那么这是一个警告而不是错误,说明你的程序已经成功编译并运行了。
运行Web
切换目录
cd D:\git\rust\src

设置代码如下:
// 使用 Actix-web 框架的简单示例
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};#[get("/")]
async fn hello() -> impl Responder {HttpResponse::Ok().body("Hello world! 全栈小5博主运行的Rust第一个网站")
}#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {HttpResponse::Ok().body(req_body)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().service(hello).service(echo)}).bind("127.0.0.1:8080")?.run().await
}
编译与运行
默认设置的端口号是8080
cargo run# 或者
cargo.exe run

从上面截图可以知道,Actix-web,服务器已经启动,设置服务监听网址是:127.0.0.1:8080。
查看效果
打开浏览器访问,效果如下默认运行出现中文乱码,如何解决呢

解决乱码
通过设置Content-Type头来解决乱码问题
.content_type("text/html; charset=utf-8")
完整代码如下
// 使用 Actix-web 框架的简单示例
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};#[get("/")]
async fn hello() -> impl Responder {HttpResponse::Ok().content_type("text/html; charset=utf-8").body("Hello world! 全栈小5博主运行的Rust第一个网站")
}#[post("/echo")]
async fn echo(req_body: String) -> impl Responder {HttpResponse::Ok().content_type("text/html; charset=utf-8").body(req_body)
}#[actix_web::main]
async fn main() -> std::io::Result<()> {HttpServer::new(|| {App::new().service(hello).service(echo)}).bind("127.0.0.1:8080")?.run().await
}
设置编码问题后,即可正常显示

操作数据库
在上一步骤我们已经了解和运行了web网站,接下来再了解下如何在rust下操作数据库,并通过接口返回数据。
tiberius 库
博主这里使用tiberius库进行数据库连接和操作
安装依赖
[dependencies]
tiberius = { version = "0.12", features = ["tokio"] }
tokio = { version = "1.0", features = ["full"] }
tokio-util = { version = "0.7", features = ["compat"] }
操作运行后,会根据配置文件安装依赖

基本连接
use tiberius::{Client, Config, AuthMethod};
use tokio::net::TcpStream;
use tokio_util::compat::{TokioAsyncReadCompatExt, TokioAsyncWriteCompatExt};
use std::error::Error;#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {let mut config = Config::new();config.host("ip地址");config.port(1433);config.database("数据库名");config.authentication(AuthMethod::sql_server("账号", "密码"));// 禁用 TLS 证书验证(仅开发环境使用)config.trust_cert();let tcp = TcpStream::connect(config.get_addr()).await?;let compatible_tcp = tcp.compat();let mut client = Client::connect(config, compatible_tcp).await?;println!("成功连接到SQL Server!");// 执行查询let stream = client.query("select id,compay,job from boss_job", &[]).await?;let row = stream.into_row().await?.unwrap();let id: i32 = row.get(0).unwrap();let name: &str = row.get(1).unwrap();let job: &str = row.get(2).unwrap();println!("id: {}, compay: {}, job: {}", id, name, job);Ok(())
}
输出得效果

总结
通过这个从0到1的Rust项目实战,我成功打通了Web服务、数据库操作这些后端核心环节。
整个过程下来,有几点深刻的体会:
- 环境是第一步:Rust项目结构的搭建和Cargo.toml的依赖管理非常清晰,但刚接触得小伙伴务必注意edition版本和依赖特性的完整性,这是避免后续异步编程等问题的关键。
- 变量得可变性:这个博主在刚开始一直忘记给变量加一个mut,导致一直报错,所以刚接触得小伙伴也要特别注意这个。
- 框架效率很高:使用Actix-web框架,寥寥几行代码就能快速拉起一个高性能的Web服务器,Rust在Web领域的潜力巨大。
- 细节决定体验:一个简单的中文乱码问题,提醒我们处理Web响应时必须注意编码细节,通过设置Content-Type头即可轻松解决。
- 生态很成熟:通过tiberius库连接SQL Server数据库非常顺畅,Tokio异步运行时为网络和数据库IO提供了强大的底层支持,让我感受到了Rust在生产环境下的可靠性。
这次实践不仅让我跑通了Rust Web开发的全流程,更验证了Rust在构建高效、可靠后端服务方面的能力。接下来,我计划在此基础上实现更复杂的功能,比如图片采集和自动设置壁纸,继续探索Rust的更多可能性。
关注全栈小5,和我一起从实战中学习,一步步征服Rust!
文章推荐
【Rust】系统编程语言的核心语法以及常见应用场景浅谈:系统、Web、网络、命令行
【Rust】从0到1开发和运行Web相关功能,并简单实现数据库连接和查询
【Rust】通过系统编程语言获取当前系统内存、CPU等运行情况,以及简单实现图片采集并设置系统壁纸
