【Rust】从0到1开发和运行Web相关功能,并简单实现数据库连接和查询

上一篇文章我们已经学习和了解了Rust编程语言的大概知识点以及常见的应用场景,

因此,本篇文章博主将从Rust的Web开发,从0到1开发并运行Web相关功能,简单实现图片采集并设置系统壁纸。

目录

项目搭建

项目结构

在我们的项目目录中,需要有以下文件:

bash 复制代码
你的项目目录/
├── Cargo.toml    # 项目配置文件
└── src/
    └── main.rs   # 你的代码文件

配置文件

Cargo.toml是Rust项目的配置文件,采用TOML格式,用于定义项目元数据、依赖关系和构建配置。

核心功能

  • 项目元数据:包含名称(name)、版本(version)、Rust版本(edition)等基本信息。 25
  • 依赖管理:通过[dependencies]部分声明外部库(crate)及其版本、特性等。 24
  • 构建配置:指定编译选项、输出类型(如库或可执行文件)等。 56

关键区别

  • Cargo.lock:由Cargo自动生成并维护,记录依赖项的确切版本,确保构建可重复性。 15
    示例结构
rust 复制代码
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[dependencies]
rand = "0.8"

了解完配置文件大概用途后,我们在与 main.rs 相同的目录中创建 Cargo.toml 文件,内容如下:

rust 复制代码
[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 目录下:

rust 复制代码
# 如果当前目录结构不对,执行这些命令
mkdir src
mv main.rs src/main.rs

构建和运行

在项目根目录(有 Cargo.toml 的目录)中执行:

rust 复制代码
# 构建项目
cargo build

# 运行项目
cargo run

cargo run,这个下载过程可能需要点时间,大概十来分钟,看个人的网络快慢吧,下载的文件会比较多。

如果只出现黄色警告,那么这是一个警告而不是错误,说明你的程序已经成功编译并运行了。

运行Web

切换目录

rust 复制代码
cd D:\git\rust\src


设置代码如下:

rust 复制代码
// 使用 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

rust 复制代码
cargo run

# 或者
cargo.exe run

从上面截图可以知道,Actix-web,服务器已经启动,设置服务监听网址是:127.0.0.1:8080。

查看效果

打开浏览器访问,效果如下默认运行出现中文乱码,如何解决呢

解决乱码

通过设置Content-Type头来解决乱码问题

rust 复制代码
.content_type("text/html; charset=utf-8")

完整代码如下

rust 复制代码
// 使用 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库进行数据库连接和操作

安装依赖

rust 复制代码
[dependencies]
tiberius = { version = "0.12", features = ["tokio"] }
tokio = { version = "1.0", features = ["full"] }
tokio-util = { version = "0.7", features = ["compat"] }

操作运行后,会根据配置文件安装依赖

基本连接

rust 复制代码
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服务、数据库操作这些后端核心环节。

整个过程下来,有几点深刻的体会:

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

关注全栈小5,和我一起从实战中学习,一步步征服Rust!

文章推荐

【Rust】系统编程语言的核心语法以及常见应用场景浅谈:系统、Web、网络、命令行
【Rust】从0到1开发和运行Web相关功能,并简单实现数据库连接和查询
【Rust】通过系统编程语言获取当前系统内存、CPU等运行情况,以及简单实现图片采集并设置系统壁纸

相关推荐
NineData8 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData13 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师15 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
蚂蚁背大象18 小时前
Rust 所有权系统是为了解决什么问题
后端·rust
布列瑟农的星空19 小时前
前端都能看懂的rust入门教程(五)—— 所有权
rust
全栈老石19 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_2 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
Java水解2 天前
Rust嵌入式开发实战——从ARM裸机编程到RTOS应用
后端·rust
Pomelo_刘金2 天前
Rust:所有权系统
rust
Ranger09292 天前
鸿蒙开发新范式:Gpui
rust·harmonyos