使用Rust和Axum構建REST API的基礎

REST API以其簡單、靈活和可擴展的特點,成為構建跨平臺Web服務的首選。它通常使用JSON或XML格式進行數據交換,便于不同平臺之間的集成。在本教程中,我們將使用以下技術棧:

為什么選擇SQLX?

SQLX是一個Rust庫,它直接執行原始SQL查詢,與傳統ORM不同,SQLX提供了更高的控制性和安全性。它支持在編譯時檢查SQL查詢,從而在開發階段就能發現潛在錯誤。此外,SQLX支持多種數據庫,包括PostgreSQL、MySQL和SQLite。


環境準備與項目初始化

在開始構建API之前,我們需要完成以下準備工作:

1. 設置PostgreSQL數據庫

我們將使用Docker來創建并運行PostgreSQL容器。以下是創建容器的命令:

docker run --name rust-postgres-db -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=password -e POSTGRES_DB=rust_api -p 5432:5432 -d postgres

如果需要在容器重啟后保存數據,可以掛載一個卷:

docker run --name rust-postgres-db -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=password -e POSTGRES_DB=rust_api -p 5432:5432 -v pgdata:/var/lib/postgresql/data -d postgres

2. 初始化Rust項目

使用Cargo初始化一個新的Rust項目:

cargo new rust-axum-rest-api
cd rust-axum-rest-api

3. 添加依賴項

Cargo.toml中添加以下依賴項:

[dependencies]
axum = "0.6"
tokio = { version = "1", features = ["full"] }
sqlx = { version = "0.6", features = ["runtime-tokio-native-tls", "postgres"] }
serde = { version = "1.0", features = ["derive"] }
tracing = "0.1"
tracing-subscriber = "0.3"
dotenv = "0.15"

安裝SQLX CLI以支持數據庫遷移:

cargo install sqlx-cli --features postgres

數據庫配置與遷移

1. 配置環境變量

在項目根目錄創建.env文件,添加以下內容:

DATABASE_URL=postgres://admin:password@localhost/rust_api

.env文件添加到.gitignore中以保護敏感信息。

2. 創建數據庫

運行以下命令創建數據庫:

sqlx database create

3. 定義數據庫模式

創建遷移文件以定義usersposts表:

sqlx migrate add create_users_table
sqlx migrate add create_posts_table

在遷移文件中定義表結構,例如:

-- users 表
CREATE TABLE users (
 id SERIAL PRIMARY KEY,
 username TEXT NOT NULL,
 email TEXT NOT NULL UNIQUE
);

-- posts 表
CREATE TABLE posts (
 id SERIAL PRIMARY KEY,
 title TEXT NOT NULL,
 body TEXT NOT NULL,
 user_id INTEGER REFERENCES users(id)
);

應用遷移:

sqlx migrate run

構建REST API

1. 創建基本的Axum服務器

編寫一個簡單的啟動代碼:

use axum::{routing::get, Router};
use std::net::SocketAddr;

#[tokio::main]
async fn main() {
 let app = Router::new().route("/", get(|| async { "Hello, world!" }));

 let addr = SocketAddr::from(([0, 0, 0, 0], 5000));
 println!("Server running at http://{}", addr);

 axum::Server::bind(&addr)
 .serve(app.into_make_service())
 .await
 .unwrap();
}

運行服務器:

cargo run

訪問http://localhost:5000,應返回Hello, world!

2. 實現CRUD操作

獲取所有帖子

定義Post結構體并實現查詢邏輯:

use serde::Serialize;

#[derive(Serialize)]
struct Post {
 id: i32,
 title: String,
 body: String,
 user_id: i32,
}

async fn get_posts() -> Result<Json<Vec>, StatusCode> {
 let posts = sqlx::query_as!(Post, "SELECT * FROM posts")
 .fetch_all(&pool)
 .await
 .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

 Ok(Json(posts))
}

創建新帖子

定義CreatePost結構體并實現插入邏輯:

use serde::Deserialize;

#[derive(Deserialize)]
struct CreatePost {
 title: String,
 body: String,
 user_id: i32,
}

async fn create_post(Json(payload): Json) -> Result<Json, StatusCode> {
 let post = sqlx::query_as!(
 Post,
 "INSERT INTO posts (title, body, user_id) VALUES ($1, $2, $3) RETURNING *",
 payload.title,
 payload.body,
 payload.user_id
 )
 .fetch_one(&pool)
 .await
 .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

 Ok(Json(post))
}

更新帖子

實現更新邏輯:

async fn update_post(
 Path(id): Path,
 Json(payload): Json,
) -> Result<Json, StatusCode> {
 let post = sqlx::query_as!(
 Post,
 "UPDATE posts SET title = $1, body = $2 WHERE id = $3 RETURNING *",
 payload.title,
 payload.body,
 id
 )
 .fetch_one(&pool)
 .await
 .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

 Ok(Json(post))
}

刪除帖子

實現刪除邏輯:

async fn delete_post(Path(id): Path) -> Result<Json, StatusCode> {
 sqlx::query!("DELETE FROM posts WHERE id = $1", id)
 .execute(&pool)
 .await
 .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?;

 Ok(Json(json!({ "message": "Post deleted successfully" })))
}

總結

通過本教程,我們使用Rust和Axum構建了一個完整的REST API,涵蓋了用戶和帖子的CRUD操作。在此過程中,我們結合了SQLX實現高效的數據庫交互,并使用Serde進行JSON序列化。您可以在此基礎上擴展功能,例如添加更多路由或實現復雜的查詢邏輯。

原文鏈接: https://www.rustfinity.com/blog/create-high-performance-rest-api-with-rust

上一篇:

五大Python REST API框架

下一篇:

HTTP API vs WebSocket API:選擇哪個來實現實時通信?
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費