【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等运行情况,以及简单实现图片采集并设置系统壁纸

相关推荐
墨辰JC2 小时前
基于STM32标准库的FreeRTOS移植与任务创建
数据库·stm32·嵌入式硬件·freertos
R.lin2 小时前
MongoDB知识点与技巧总结
数据库·mongodb
幽水-椰子糖2 小时前
达梦守护搭建
数据库·达梦
q***3752 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
王小小鸭3 小时前
【Oracle APEX开发小技巧17】交互式网格操作按钮根据条件/状态设置能否被点击生效
数据库·oracle·oracle apex
lang201509283 小时前
oracle 11查询数据库锁
数据库·oracle
hweiyu003 小时前
Oracle 基础入门:核心概念与实操指南(视频教程)
数据库·oracle
羊锦磊4 小时前
[ 项目开发 1.0 ] 新闻网站的开发流程和注意事项
java·数据库·spring boot·redis·spring·oracle·json
hjhcos4 小时前
【SQL server】不同平台相同数据库之间某个平台经常性死锁
数据库