具有可变路径段的 rust 诗路由

14ifxucb  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(147)

我在rust中有一个使用poem::openapi的HTTP端点。我想要一个变量段路径的单一处理程序。

#[OpenApi]
impl NvApi {
    #[oai(path = "/:namespace/:id", method = "get")]
    async fn get(
        &self,
        nv: Data<&SharedHandle>,
        namespace: Path<String>,
        id: Path<String>,
    ) -> Result<GetResponse, poem::Error> {
        log::debug!("get {}/{}", namespace.as_str(), id.as_str());
...
...
...
}

我希望上面的代码能够处理像/mynamespace/mydomain/myid/mynamespace/myid这样的路径--将任意数量的段加载到命名空间变量中,但总是将尾部段加载到'id'变量中。
我在诗歌库中看到了对“*path”的引用,但找不到任何文档或通配符的示例。我想使用上面的模式,因为我的SharedHandle impl是必需的。

guicsvcw

guicsvcw1#

这是不可能的。
poem中的路径解析器在遇到通配符标记后会中断,这意味着它不能用于在路径中间进行匹配。
最好的解决方法是使用匹配除最后一段以外的所有路径段的正则表达式。在代码中,假设它会显示为:

#[oai(path = "/:namespace<.+(?=/)>/:id", method = "get")]
    async fn get(&self, ...) ...

但是poem使用regex crate,而does not support lookaheads(需要忽略最后一个斜杠)。
相反,你将不得不使用一个没有lookaheads的正则表达式,并手动删除尾部的斜杠:

#[OpenApi]
impl Api {
    #[oai(path = "/:namespace<.+/>:id", method = "get")]
    async fn get(
        &self,
        ...
        namespace: Path<String>,
        id: Path<String>,
    ) -> ... {
        // GET /a/b/c
        println!("{}", namespace.to_string()); // a/b/
        println!("{}", id.to_string());        // c
        ...
    }
}

相关问题