| 步驟 | 目標(biāo) | 關(guān)鍵實現(xiàn) |
|---|---|---|
| ① 查詢參數(shù)解析 | 提取 from_ms 和 n_results |
Actix Web 自動解析 |
| ② 業(yè)務(wù)邏輯解耦 | 保持 handler 簡潔 | 新建 backend.rs |
| ③ 虛擬數(shù)據(jù)生成 | 返回 Vec<Trip> |
get_fake_trips() |
| ④ 錯誤處理 | Result 類型 + match |
HTTP 200 vs 500 |
請求示例:
GET /trips?from_ms=1714204800000&n_results=100
Handler 簽名:
async fn trips(Query(params): Query<TripRequest>) -> impl Responder {
// params.from_ms / params.n_results 即用
}
定義請求體:
use serde::Deserialize;
#[derive(Deserialize)]
struct TripRequest {
from_ms: u64,
n_results: usize,
}
?? AI 助攻
想自動生成「查詢參數(shù)校驗」代碼?用「代碼生成」提示詞,30 秒即可拿到serde+validator模板,再交給「代碼優(yōu)化」砍掉冗余克隆,性能提升 40%!
backend.rssrc/
├── main.rs
└── backend.rs // 新增
// backend.rs
use chrono::{DateTime, Utc};
#[derive(Serialize)]
pub struct Trip {
pub id: u32,
pub pickup_time: DateTime<Utc>,
pub distance: f32, // 英里
}
pub fn get_fake_trips(from_ms: u64, n_results: usize) -> Result<Vec<Trip>, String> {
if n_results == 0 {
return Err("n_results must be > 0".to_string());
}
let base_time = DateTime::from_utc(
NaiveDateTime::from_timestamp_opt((from_ms / 1000) as i64, 0).unwrap(),
Utc,
);
let mut trips = Vec::with_capacity(n_results);
for i in 0..n_results {
trips.push(Trip {
id: i as u32,
pickup_time: base_time + Duration::minutes(i as i64),
distance: 1.0 + (i as f32) * 0.1,
});
}
Ok(trips)
}
?? AI 審查
把「虛擬數(shù)據(jù)生成邏輯」提交評審?「代碼審查助手」可自動檢查邊界條件、空 Vec 處理,提前發(fā)現(xiàn) 80% 潛在 Bug!
在 main.rs 中調(diào)用:
use crate::backend::{get_fake_trips, Trip};
async fn trips_handler(Query(req): Query<TripRequest>) -> impl Responder {
match get_fake_trips(req.from_ms, req.n_results) {
Ok(trips) => (StatusCode::OK, Json(trips)),
Err(e) => (StatusCode::INTERNAL_SERVER_ERROR, Json(json!({"error": e}))),
}
}
啟動服務(wù)器:
cargo run
發(fā)起請求:
curl -X GET "http://localhost:8080/trips?from_ms=1714204800000&n_results=5"
預(yù)期返回(簡化):
[
{"id":0,"pickup_time":"2024-04-27T00:00:00Z","distance":1.0},
{"id":1,"pickup_time":"2024-04-27T00:01:00Z","distance":1.1},
...
]
| 階段 | 技術(shù)點 | 工具/庫 |
|---|---|---|
| ① 真實數(shù)據(jù) | 連接 PostgreSQL | sqlx + 遷移 |
| ② 分頁 | limit+offset 查詢 |
serde_qs |
| ③ 認(rèn)證 | JWT 校驗 | actix-jwt |
| ④ 日志 | 結(jié)構(gòu)化日志 | tracing |
| ⑤ 容器化 | 多階段構(gòu)建 | Docker |
? AI 補救
把「Dockerfile 多階段構(gòu)建」寫進(jìn)注釋太麻煩?用「代碼文檔生成器」提示詞,自動在文件頭部生成標(biāo)準(zhǔn)注釋,提醒后續(xù)接入緩存掛載,文檔一鍵達(dá)標(biāo)!
通過以上步驟,我們成功為 Rust 構(gòu)建的 REST API 添加了一個新的端點。這個端點能夠解析查詢參數(shù)并返回虛擬的紐約市出租車行程數(shù)據(jù)。雖然我們目前返回的是虛擬數(shù)據(jù),但這一實現(xiàn)為后續(xù)集成真實數(shù)據(jù)奠定了基礎(chǔ)。Rust 的強類型系統(tǒng)和編譯器強制的隱私機制,使得代碼更加安全和可靠。通過解耦邏輯,我們也提高了代碼的可維護(hù)性。
下周將繼續(xù)探討如何集成真實數(shù)據(jù)庫與分頁功能,敬請期待!??
原文鏈接: https://www.realworldml.net/blog/let-s-rust