【Rust实战】Axum + Nextjs 前后端全栈开发04:设计路由

新建路由库

创建一个route库
项目中跟路由相关的一些操作代码都放在这个库,方便后续进行管理。
cargo new --lib route

添加依赖
route/src/Cargo.toml

[package]
name = "route"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
axum = "0.7.5"
tokio = { version = "1.37.0", features = ["full"] }

调整路由相关代码
route/src/lib.rs


use axum::{routing::get, Router};

pub fn route() -> Router {
      Router::new().route("/", get(|| async { "Hello, World!" }))
}

backend/Cargo.toml

workspace = { members = ["route"] }
[package]
name = "axum-next-app"
version = "0.1.0"
edition = "2021"
authors = ["SunsJay <sunsjay0806@gmail.com>"]
keywords = ["axum", "web", "database"]
license = "MIT"

[[bin]]
name = "axum-next-app"
path = "main.rs"

[dependencies]
toml = "0.8"
serde = { version = "1.0", features = ["derive"] }
axum = "0.7.5"
tokio = { version = "1.37.0", features = ["full"] }
route = { path = "route" }

backend/main.rs

use route::route;
#[tokio::main]
async fn main() {
    println!("🚀 Axum - NextJS - App v1.0");
    println!("🧓 SunsJay <sunsjay0806@gmail.com>");
    let app = route();
    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

运行

测试

版本管理
运行和测试没有问题后,我们使用git来进行提交。后续我们使用git-flow来进行开发管理。

Git Flow

Git-flow是一种Git分支管理模型,旨在简化发布管理。它由软件开发人员Vincent Driessen于2010年引入。Git-flow定义了不同类型的Git分支,以及它们之间的交互关系。该工作流适用于任何大小的团队,特别适用于需要定期发布软件的团队。Git-flow涉及以下五种分支类型:Main、Develop、Feature、Release和Hotfix。通过这些分支,团队可以更有效地管理功能、bug修复和发布。Git-flow的核心概念包括主分支(Main)、开发分支(Develop)、功能分支(Feature)、热修复分支(Hotfix)和发布分支(Release)。通过这些分支,团队可以更有条理地管理代码的开发、测试和发布过程。

初始化

git flow init

新增feature

git flow feature start route

添加对其他未定义路由的处理

axum有定义好的成员函数fallback,我们只需要调用,并定义当没有路由与传入的请求匹配时,我们该如何处理该请求。

我们返回404代码,并返回Not Found内容。
backend/route/src/lib.rs

use axum::http::StatusCode;
use axum::{routing::get, Router};
pub fn route() -> Router {
    Router::new()
        .route("/", get(|| async { "Hello, World!" }))
        .fallback(fallback)
}

pub async fn fallback() -> (StatusCode, &'static str) {
    (StatusCode::NOT_FOUND, "Not Found")
}

backend/main.rs

use route::route;  
  
#[tokio::main]  
async fn main() {  
    println!("🚀 Axum - NextJS - App v1.0");  
    println!("🧓 SunsJay <sunsjay0806@gmail.com>");  
    let app = route();  
    //    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();  
    match tokio::net::TcpListener::bind("0.0.0.0:3000").await {  
        Ok(listener) => axum::serve(listener, app).await.unwrap(),  
        Err(e) => {  
            println!("{}", e);  
        }  
  
    }  
}

运行
成功编译并运行

测试
除了\路由其他请求都是404

版本管理
某一个功能编写完成并测试通过就可以提交一次更新。

重构优化
基本功能我们实现了,但是我们可以继续进行一些重构优化。使项目的可读性,易维护性,结构合理性更好。

RESTful API
RESTful API(Representational State Transfer API)是一种符合REST架构风格的应用程序接口(API)。它通过使用HTTP请求来访问和使用数据,支持对资源进行读取(GET)、更新(PUT)、创建(POST)和删除(DELETE)等操作。RESTful API基于REST架构风格,是一种常用的Web服务开发方法,也被称为RESTful Web服务或REST API。RESTful API的设计原则包括统一接口、无状态性、分层系统、可缓存性和可选的代码请求等特点。通过RESTful API,客户端可以与服务器进行交互,请求资源并获取服务器返回的表示形式,实现数据交换和操作的目的。

backend/route/src/lib.rs

use axum::http::StatusCode;  
use axum::{routing::get, Router};  
  
pub fn route() -> Router {  
    let user_routes = Router::new().route("/:id", get(|| async { "User" }));  
    let api_routes = Router::new()  
        .nest("/users", user_routes);  
  
    Router::new().route("/", get(|| async { "Hello, World!" })).nest("/v1/api", api_routes).fallback(fallback)  
}  
  
  
pub async fn fallback() -> (StatusCode, &'static str) {  
    (StatusCode::NOT_FOUND, "Not Found")  
}

运行测试

版本管理

git-flow features finish route
git switch main
git merge develop

简单的用户增删改查

我们接下来进行一个简单的用户增删改查路由的设计,里面的功能我们目前不进行填充,只是进行搭建框架。

新建一个开发分支
git-flow feature start route/users

为user路由添加增删改查的方法

use axum::http::StatusCode;  
use axum::Router;  
use axum::routing::{delete, get, put, post};  
  
pub fn route() -> Router {  
    let user_routes = Router::new().route("/:id", get(|| async { "Get User" }).delete(|| async { "Delete User" }).post(|| async { "Post User" }).put("Put User"));  
    let api_routes = Router::new()  
        .nest("/users", user_routes);  
  
    Router::new().route("/", get(|| async { "Hello, World!" })).nest("/v1/api", api_routes).fallback(fallback)  
}  
  
  
pub async fn fallback() -> (StatusCode, &'static str) {  
    (StatusCode::NOT_FOUND, "Not Found")  
}

运行测试



版本管理

git-flow feature finish route/users
git swith main
git metge develop

总结

这一章节主要是介绍如何设计使用Axum路由,规范化的定义和管理,嵌套,以及未定义路由的处理。,关于具体的实现我们并没有完成。这个我们在后续的具体开发中再来填充完善。

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值