首页 > 其他分享 >路由

路由

时间:2023-11-02 09:56:12浏览次数:33  
标签:axum get pub news id 路由

axum 提供了常用的 HTTP 请求方式对应的路由,比如 getpostputdelete 等。除此之外,axum 还提供了“嵌套路由”。路由,通常和 handler(处理函数) 结合在一起。

handler 是什么

通常理解,handler 是指接收用户的请求,并将处理结果作为响应返回给用用户的函数。

它的返回值是什么

正如《axum 中的各种响应》所说,在 axum 中,所有实现了 IntoResponse 的数据类型都可以作为 handler 的返回值。

常用的请求方式

请求方式说明
GET 该请求应该只被用于获取数据
POST 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用
PUT 用请求有效载荷替换目标资源的所有当前表示
DELETE 删除指定的资源

上表节选自《HTTP 请求方法》,更多请求方法,请参照原文。

在 axum 中,axum::routing 重新导出了 HTTP 请求方式的对应函数。也就是说,使用axum::routing::get() 来定义一个 GET 请求的路由。

链式操作

axum 的路由支持链式操作。假设以下场景:在编辑某用户信息时,首先要使用表单显示用户当前的信息(GET),修改完成之后,还要将这个表单数据发送到服务器(POST)。在这个过程中,路由的 URL 是一样的。

由于还未学习到模板的相关内容,本例我们用直接书写 HTML 来作演示。你也可以看一下《axum 中使用模板引擎

定义相关的 struct:

/// 通过表单提交数据
#[derive(Deserialize)]
pub struct EditUser {
    pub id: i32,
    pub username: String,
    pub email: String,
}

/// 对应数据库的模型
pub struct UserModel {
    pub id: i32,
    pub username: String,
    pub email: String,
}

定义 handler:

/// 显示要修改的用户
async fn edit_user(Path(id): Path<i32>) -> Html<String> {
    let model = UserModel {
        id,
        username: "AXUM.RS".to_string(),
        email: "[email protected]".to_string(),
    };
    let html = format!(
        r#"
        <!DOCTYPE html>
        <html lang="zh-Hans">
          <head>
            <meta charset="utf-8" />
            <meta name="author" content="axum.rs ([email protected])" />
            <title>
              修改用户-AXUM中文网
            </title>
          </head>
          <body>
          <form method="post" action="/edit_user/{}">
          <input type="hidden" name="id" value="{}">
          <div>
            <label>用户名</label>
            <input type="text" name="username" value="{}">
          </div>
          <div>
            <label>Email</label>
            <input type="email" name="email" value="{}">
          </div>
          <div>
            <button type="submit">提交</button>
          </div>
          </form>
          </body>
          </html>
        "#,
        model.id, model.id, model.username, model.email
    );
    Html(html)
}

/// 对用户进行修改
async fn edit_user_action(Form(frm): Form<EditUser>) -> Html<String> {
    let html = format!(
        r#"
        <!DOCTYPE html>
        <html lang="zh-Hans">
          <head>
            <meta charset="utf-8" />
            <meta name="author" content="axum.rs ([email protected])" />
            <title>
              修改用户-AXUM中文网
            </title>
          </head>
          <body>
            <h1>修改成功!</h1>
            <p>修改后的用户资料:</p>
            <div>ID: {} </div>
            <div>用户名: {} </div>
            <div>Email: {} </div>
          </body>
          </html>"#,
        frm.id, frm.username, frm.email
    );
    Html(html)
}

定义路由:

route("/edit_user/:id", get(edit_user).post(edit_user_action))

嵌套路由

为了方便进路由进行分组,axum 提供了嵌套路由功能。比如有以下路由:

通过嵌套路由可以使其更清晰:

定义 handlers:

async fn news_index() -> &'static str {
    "new index"
}
async fn news_detail(Path(id): Path<i32>) -> String {
    format!("new detail {}", id)
}
async fn news_comments(Path(id): Path<i32>) -> String {
    format!("new comments {}", id)
}

定义子路由:

let news_router = Router::new()
        .route("/", get(news_index))
        .route("/detail/:id", get(news_detail))
        .route("/comments/:id", get(news_comments));

将子路由嵌到全局路由:

.nest("/news", news_router);

本章讲解了 axum 路由功能。代码可以在代码仓库中找到。

思考题:

如何在 axum 实现跳转(即重定向)功能?

提示:

  1. 使用 (StatusCode, HeaderMap, ()) 响应
  2. 对应的状态码可查阅这里
  3. 对应的 Header 可查阅这里

参考答案:

async fn redirect() -> (StatusCode, HeaderMap, ()) {
    let mut headers = HeaderMap::new();
    headers.insert(
        axum::http::header::LOCATION,
        "https://axum.rs".parse().unwrap(),
    );
    (StatusCode::FOUND, headers, ())
}

标签:axum,get,pub,news,id,路由
From: https://www.cnblogs.com/pythonClub/p/17804740.html

相关文章

  • 无涯教程-React Native - 路由
    在本章中,我们将了解ReactNative中的导航。步骤1-安装路由首先,我们需要安装Router路由,我们将在本章中使用ReactNativeRouterFlux,您可以在终端的项目文件夹中运行以下命令。npmireact-native-router-flux--save步骤2-应用代码由于我们希望Router处理整个应用程序......
  • 发现这个ip有bt下载,所以改路由,让其访问到一个不存在的ip上 route add
    管理员权限cmd发现这个ip有bt下载,所以改路由,让其访问到一个不存在的ip上routeadd-p195.154.181.225mask255.255.255.255127.0.0.2---------------------------------------------生活的意义就是你自己知道你要做什么,明确目标。没有目标,后面都是瞎扯!https://pengcheng......
  • vue路由模式区别
    目的:在vue中路由模式有history和hash模式两种模式:他们的目的是为了在SPA单页面情况下,切换页面不会向后端服务器发送请求;hash模式:为以#作为分隔符,原理:通过window.location.hash获取hash值;监听hash中的hashchange事件,当URL的hash发生改变的时候,触发事件。在地......
  • vuejs3.0 从入门到精通——初始化项目——路由
    路由 VueRouter是Vue.js官方的路由管理器,它和Vue.js深度集成,用于构建单页面应用。Vue.js单页面应用是基于路由和组件映射的,路由用于配置访问路径,将组件(components)映射到路由路径(routes)。一、路由模式 VueRouter常用的两种模式是hash模式和HTML5模式,对应的创建......
  • N1中openwrt实现不插网线就能上网,通过wifi连接路由器
    环境说明:路由器:N1盒子系统版本:openwrt前言既然想用这个功能,基本上就是没有网线连接盒子了,不仅限于N1盒子只要是openwrt系统就可以创建接口在openwrt界面上依次点击“网络”->“无线”,第一项是2.4GHz的wifi配置,第二项是5GHz的wifi设置,确定要转接的wifi的频率,点击对应项后面的“扫......
  • uniapp实现路由拦截
    背景在APP中,跳转页面需要判断是否有权限跳转,比如是否登录。开发环境是TMUI+VUE3+TS,这难免有一些限制,在网上搜索后,发现简书网站有个博主写的链接正合我意,不过他的是JavaScript+uniapp原生开发,根据我的需求,自己稍微改了些。0x01复制代码简书博客链接:https://www.jianshu.com/p/b......
  • TP-LINK XDR6088 WiFi6路由器 简单开箱评测
    TL-XDR6088易展版AX6000双频WiFi6路由器简单开箱测评,双2.5G网口,双频8流,8颗FEM,支持Docker。TP-LINKXDR5470WiFi6路由器简单开箱评测:https://blog.zeruns.tech/archives/725.htmlTP-LINKXDR3040WiFi6路由器简单开箱评测:https://blog.zeruns.tech/archives/683.html参数CPU:MT79......
  • ensp 简单配置路由添加ip操作小实例
    ensp简单配置路由添加ip操作displaycu#查看路由器配置displayiprouting-table[x.x.x.x]#查看路由表【和x.x.x.x相关的条】案例一、2个路由器配置ip地址给2个路由器配合ip地址,方法一样ipaddressx.x.x.x.x掩码24(255.225.255.0)1.启动2个路由器,有......
  • 路由守卫中的白名单
    在写登录注册的路由守卫的时候,如果直接进行判断,会出现错误router.beforeEach((to,from,next)=>{if(VueCookies.get("token")){next()}else{next("/login")}})  所以要在判断的时候添加白名单,在路由守卫中使用白名单是一种常见的实践,允许你指定哪些路......
  • 鸿蒙极速入门(五)-路由管理(Router)
    页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。一、基础使用Router模块提供了两种跳转模式,分别是router.pushUrl()和router.replaceUrl()。这两种模式决定了目标页面是否会......