想自動生成帶注釋的 Cargo.toml?用「代碼生成」提示詞,30 秒即可拿到模板,再交給「代碼優化」砍掉冗余特性,編譯速度提升 20%!


二、技術棧與版本

組件 用途 版本
shuttle-service 零運維部署平臺 0.46.x
axum Web 框架 0.7.x
sqlx 異步 PostgreSQL 驅動 0.7.x
serde JSON 序列化 1.0
tokio 異步運行時 1.x

三、項目初始化與結構

# 安裝 Shuttle CLI
cargo install cargo-shuttle

# 創建項目
cargo shuttle init --name shuttle-example-axum
cd shuttle-example-axum

骨架:

src/
├── main.rs # 入口 + 路由
├── db.rs # 數據庫連接
├── models.rs # 實體與 JSON
└── migrations.sql # 建表腳本

四、數據庫與遷移:一行注解搞定

① 注解獲取連接池

use shuttle_shared_db::Postgres;
use sqlx::PgPool;

#[shuttle_runtime::main]
async fn axum(
    #[Postgres] pool: PgPool,   // ← 自動注入
) -> shuttle_axum::ShuttleAxum {
    // 運行遷移
    sqlx::migrate!()
        .run(&pool)
        .await
        .expect("migrate failed");

    let state = AppState { db: pool };
    Ok(router(state).into())
}

② 遷移文件 migrations.sql

CREATE TABLE IF NOT EXISTS records (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT NOT NULL
);

?? AI 審查
把「SQL 注入風險」提交評審?「代碼審查助手」可自動檢查參數綁定、拼接語句,提前發現 80% 潛在 Bug!


五、模型與 JSON:自動映射

// src/models.rs
use serde::{Deserialize, Serialize};
use sqlx::FromRow;

#[derive(Debug, Serialize, Deserialize, FromRow)]
pub struct Record {
    pub id: i32,
    pub name: String,
    pub email: String,
}

#[derive(Debug, Deserialize)]
pub struct CreateRecord {
    pub name: String,
    pub email: String,
}

#[derive(Debug, Deserialize)]
pub struct UpdateRecord {
    pub name: Option<String>,
    pub email: Option<String>,
}

六、路由與業務邏輯

① 共享狀態

// src/main.rs
use axum::{
    extract::{Path, State, Json},
    http::StatusCode,
    response::IntoResponse,
    routing::{get, post, put, delete},
    Router,
};
use sqlx::PgPool;

#[derive(Clone)]
struct AppState {
    db: PgPool,
}

async fn create_record(
    State(state): State<AppState>,
    Json(payload): Json<CreateRecord>,
) -> impl IntoResponse {
    let rec = sqlx::query_as!(
        Record,
        "INSERT INTO records (name, email) VALUES ($1, $2) RETURNING *",
        payload.name, payload.email
    )
    .fetch_one(&state.db)
    .await
    .unwrap();
    (StatusCode::CREATED, Json(rec))
}

② 動態路徑與參數綁定

async fn get_record_by_id(
    State(state): State<AppState>,
    Path(id): Path<i32>,
) -> impl IntoResponse {
    let rec = sqlx::query_as!(
        Record,
        "SELECT * FROM records WHERE id = $1",
        id
    )
    .fetch_optional(&state.db)
    .await
    .unwrap();

    match rec {
        Some(r) => (StatusCode::OK, Json(r)),
        None => (StatusCode::NOT_FOUND, Json("")),
    }
}

③ 部分更新(PATCH)

async fn update_record(
    State(state): State<AppState>,
    Path(id): Path<i32>,
    Json(payload): Json<UpdateRecord>,
) -> impl IntoResponse {
    // 動態構建 SET 子句
    let mut sql = String::from("UPDATE records SET ");
    let mut args: Vec<String> = vec![];
    if let Some(name) = payload.name {
        sql.push_str("name = $1,");
        args.push(name);
    }
    if let Some(email) = payload.email {
        sql.push_str("email = $2,");
        args.push(email);
    }
    sql.truncate(sql.len() - 1); // 去掉末尾逗號
    sql.push_str(" WHERE id = $3 RETURNING *");

    let rec = sqlx::query_as::<_, Record>(&sql)
        .bind(args.get(0).unwrap_or(&"".to_string()))
        .bind(args.get(1).unwrap_or(&"".to_string()))
        .bind(id)
        .fetch_one(&state.db)
        .await
        .unwrap();
    (StatusCode::OK, Json(rec))
}

? AI 補救
把「動態 SQL 拼接」寫進注釋太麻煩?用「代碼文檔生成器」提示詞,自動在函數頭部生成標準注釋,提醒后續接入 sqlx-query-builder,文檔一鍵達標!


七、路由匯總

fn router(state: AppState) -> Router {
    Router::new()
        .route("/records", post(create_record).get(list_records))
        .route("/records/:id", get(get_record_by_id).put(update_record).delete(delete_record))
        .with_state(state)
}

八、部署與測試

① 本地運行

cargo shuttle run
# 默認端口 8000

② 一鍵部署

cargo shuttle deploy --allow-dirty
# 自動生成域名:https://shuttle-example-axum.shuttleapp.rs

③ 快速驗證

# 新增
curl -X POST https://<your-domain>.shuttleapp.rs/records \
  -H "Content-Type: application/json" \
  -d '{"name":"Alice","email":"alice@example.com"}'

# 查詢
curl https://<your-domain>.shuttleapp.rs/records/1

九、擴展方向

方向 工具/庫
自定義錯誤 thiserror + axum::response::IntoResponse
測試 testcontainers + axum-test-helper
分頁 sqlx-query-builder + limit/offset
JWT 認證 jsonwebtoken + axum-extra
OpenAPI utoipa + swagger-ui

十、總結與下一步

通過本教程,你已掌握:

下一步可添加認證、分頁、OpenAPI 文檔等功能,打造生產級后端。祝編碼愉快!

今晚就 push 到 GitHub,明天就能用 Shuttle 一鍵上線!??


原文鏈接: https://www.shuttle.dev/blog/2024/01/31/write-a-rest-api-rust

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
返回頂部
上一篇
Rust 新手村:10 分鐘搞定你的第一個 RESTful API
下一篇
Vue中使用echarts@4.x中國地圖及AMap相關API的使用
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
亚洲国产精品久久久久婷婷884 | 欧美视频一区在线| 欧美zozo另类异族| 丁香啪啪综合成人亚洲小说| 国产视频一区二区三区在线观看| 精品中文字幕一区二区小辣椒| www激情久久| 欧美日韩一区久久| 国产不卡高清在线观看视频| 亚洲国产一区二区在线播放| 久久精品夜色噜噜亚洲aⅴ| www.视频一区| 视频一区免费在线观看| 欧美一二三区在线| 欧美图区在线视频| 丁香桃色午夜亚洲一区二区三区| 中文字幕永久在线不卡| 色综合久久中文综合久久97| 一区二区三区欧美在线观看| 8x福利精品第一导航| 日韩**一区毛片| 一区二区三区在线视频播放| 国产亚洲va综合人人澡精品| 91精品免费在线观看| 国内精品伊人久久久久av一坑| 久久久久成人黄色影片| 欧美日韩午夜精品| 成人美女视频在线观看| 久久久精品人体av艺术| 91精品国产日韩91久久久久久| 91免费版在线| 93久久精品日日躁夜夜躁欧美| 不卡视频一二三四| 久久91精品久久久久久秒播| 亚洲黄色尤物视频| 亚洲视频每日更新| 国产精品高清亚洲| 欧美成人一区二区三区在线观看| 成人免费看视频| av中文字幕亚洲| 91美女蜜桃在线| 欧美日韩午夜在线| 欧美日韩亚洲综合| 日韩免费高清av| 久久嫩草精品久久久精品一| 久久精品视频一区二区三区| 久久久99精品免费观看不卡| 久久色.com| 丝袜a∨在线一区二区三区不卡| 日韩av午夜在线观看| 国产精品1区2区3区| 欧美日韩国产一级片| 欧美一区二区视频在线观看| 久久精品人人爽人人爽| 亚洲国产日韩一区二区| 琪琪久久久久日韩精品| 91国偷自产一区二区开放时间| 久久综合色播五月| 日韩中文字幕麻豆| 91美女视频网站| 18成人在线视频| 国产精品一二三四五| 欧美一区二区精品| 日韩电影在线免费看| 欧洲视频一区二区| 中文字幕成人在线观看| 不卡一区二区在线| 亚洲一区二区三区精品在线| 欧美三级视频在线播放| 久久国产精品区| 精品成a人在线观看| 成人av一区二区三区| 这里只有精品视频在线观看| 久久精品人人做人人爽人人| 青青草国产成人99久久| 国产精品水嫩水嫩| 日韩一区二区影院| 精品一区二区在线播放| 3d成人动漫网站| 不卡的av电影在线观看| 亚洲va天堂va国产va久| 国产精品欧美综合在线| 久久国产精品区| 亚洲综合视频在线| 国产欧美日韩精品一区| 91精品国产福利| 欧美在线观看禁18| 91亚洲精品一区二区乱码| 亚洲一区二区欧美日韩| 亚洲人成网站精品片在线观看| 久久一二三国产| 精品电影一区二区| 正在播放一区二区| 精品一区二区精品| 免费观看日韩av| 久久精品国产成人一区二区三区| 日本欧美肥老太交大片| 午夜精品一区在线观看| 天堂一区二区在线| 日韩制服丝袜先锋影音| 日本 国产 欧美色综合| 另类小说色综合网站| 日韩激情一二三区| 成人一区二区三区中文字幕| 色婷婷久久一区二区三区麻豆| 91色在线porny| 精品成人一区二区| 777奇米成人网| 日韩欧美亚洲另类制服综合在线| 国产精品18久久久久久久久 | 无码av免费一区二区三区试看 | 亚洲欧美日韩综合aⅴ视频| 亚洲免费毛片网站| 国产成都精品91一区二区三| 欧美一区二区三区在线看| 国产精品色哟哟网站| 激情六月婷婷综合| 欧美大度的电影原声| 一区二区在线看| 91香蕉视频在线| 51精品国自产在线| 日本欧美一区二区三区乱码| 欧美亚洲综合久久| 丝袜美腿亚洲一区二区图片| 国产一区二区三区黄视频 | 日韩一区有码在线| 一区二区在线观看免费| 欧美日韩免费观看一区二区三区| 欧美国产禁国产网站cc| 国产激情视频一区二区三区欧美| 久久久美女艺术照精彩视频福利播放 | 激情综合一区二区三区| 欧美大片在线观看| 日本精品一区二区三区四区的功能| 亚洲国产欧美在线| 国产91精品露脸国语对白| 欧美激情在线一区二区| 欧美三级欧美一级| 成人免费毛片app| 精品一二三四区| 1024成人网| 欧美一区二区视频在线观看2020| 不卡影院免费观看| 精久久久久久久久久久| 午夜视频在线观看一区二区 | 欧美视频完全免费看| 国产成人久久精品77777最新版本| 91福利视频久久久久| 成人午夜免费电影| 久久99精品久久久久| 日本不卡视频在线| 欧美一区二区三区电影| 亚洲午夜久久久久久久久电影网 | 欧美激情中文不卡| 国产日韩欧美精品一区| 日韩欧美一级二级| 国产电影一区二区三区| 国产乱淫av一区二区三区| 国产一区二区看久久| 国产精品123| 欧美三级资源在线| 91精品国产色综合久久ai换脸 | 久久久久久久久伊人| 国产精品久久免费看| 综合色中文字幕| 午夜精品在线看| 国产精品1区2区3区| 91麻豆自制传媒国产之光| 在线精品视频小说1| 欧美精品久久久久久久多人混战| 色综合夜色一区| www欧美成人18+| 亚欧色一区w666天堂| 国产欧美一区视频| 一卡二卡三卡日韩欧美| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲裸体xxx| 亚洲女人小视频在线观看| 懂色av一区二区在线播放| 国产亚洲欧洲一区高清在线观看| 秋霞影院一区二区| 欧洲一区二区三区在线| 欧美一区永久视频免费观看| 亚洲人精品午夜| 色老头久久综合| 国产亚洲一区二区在线观看| 日韩电影免费一区| 色婷婷精品久久二区二区蜜臀av| 2017欧美狠狠色| 国产成人在线视频网址| 欧美激情中文字幕| 高清在线不卡av| 国产精品伦一区| 91丨九色丨蝌蚪富婆spa| 欧美午夜精品久久久久久孕妇| 制服.丝袜.亚洲.中文.综合| 国产精品国产三级国产普通话99| 色猫猫国产区一区二在线视频| 一区二区三区国产豹纹内裤在线 | 蜜桃久久久久久|