我想在Axum中创建以下路由:

/v1/users/:username  # String
/v1/users/:user_id   # u64

但创建这些路由:

Router::new()
    .route("/v1/users/:username", get(get_user))
    .route("/v1/users/:user_id", get(get_user))

由于此错误,无法执行以下操作:

thread 'main' panicked at 'Invalid route "/v1/users/:user_id": insertion failed due to conflict with previously registered route: /v1/users/:username'

如何创建接受多种不同URL参数类型的同一路由?

推荐答案

这在概念层面上甚至说不通.假设您收到URI路径为/v1/users/12345的请求.12345部分应该如何解释?作为用户名,还是作为数字ID?如果您有一些内部逻辑,例如要求用户名必须以字母开头,则可以执行以下操作:

  1. 增加一条线路route("/v1/users/:username-or-id", get(get_user)).

  2. get_user处理机上使用Path(String)个抽取器.

  3. Inside get_user手动try 解析路径段,并根据结果使用不同业务逻辑.

例如:

async fn get_user(Path(username_or_id): Path<String>) -> impl IntoResponse {
    if let Ok(numeric_id) = username_or_id.parse::<u64>() {
        // use `numeric_id: u64`
    } else {
        let username = username_or_id;
        // use `username: String`
    }
}

取而代之的是,您可能只有两个独立的端点,这可能会更清楚,也更难误用.

/v1/users/:username  # String
/v1/users/id/:user_id   # u64

Rust相关问答推荐

在Rust中创建可变片段的可变片段的最有效方法是什么?

捕获Rust因C++异常而产生panic

如何在tauri—leptos应用程序中监听后端值的变化?""

如何使用 list 在Rust for Windows中编译?

铁 rust 中的共享对象实现特征

重写Rust中的方法以使用`&;mut self`而不是`mut self`

有没有可能让泛型Rust T总是堆分配的?

铁 rust 中双倍或更多换行符的更好练习?

在Rust中,Box:ed struct 与普通 struct 在删除顺序上有区别吗?

为什么Deref类特征不构成?

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

允许 rust 迹 struct 条目具有多种类型

失真图像图形捕获Api

Rust 为什么被视为borrow ?

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

max(ctz(x), ctz(y)) 有更快的算法吗?

意外的正则表达式模式匹配

Iterator::collect如何进行转换?

`if let` 只是另一种编写其他 `if` 语句的方式吗?

如何用另一个变量向量置换 rust simd 向量?