基于Rust的Axum框架的动态路由解析

uqjltbpv  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(184)

我目前正在使用Axum框架从头开始实现一个Web服务。此服务的目标是访问和读/写目标目录上的文件或目录。
想我想实现的路线有以下几条:

PUT https://<domain>/<directory>/?some_query=value
PUT https://<domain>/<directory>/<file>?some_other_query=value

基本上,如果路由以'/'结尾,它是一个目录,否则是一个文件。
我从阅读他们的文档中了解到,他们的路由通配符不支持这样的东西,例如。我定义了以下路由器:

Router::new()
  .route("/*path", get(my_get_handler))
  .route("/*path", put(my_put_handler)));

举例来说:

/dir/sub/sub2/file.txt -> Should be a file
/dir/sub/sub2/sub3/ -> Should be a dir
/dir/sub/sub2/something -> Should be a file

我认为可能的情况是这样的:

Router::new().route("/*path/*file", put(handler));

如何使用axum框架实现这一点?

ddarikpa

ddarikpa1#

你所拥有的将工作得很好,当使用一个隐藏模式时,完整的路径将被保留:

.route("/*path", get(file_handler))
use axum::extract::Path;
use axum::response::IntoResponse;

async fn file_handler(Path(path): Path<String>) -> impl IntoResponse {
    println!("{path}");
}
  • GET /dir/sub/sub2/file.txt将打印dir/sub/sub2/file.txt
  • GET /dir/sub/sub2/sub3/将打印dir/sub/sub2/sub3/
  • GET /dir/sub/sub2/something将打印dir/sub/sub2/something

因此,这完全取决于你如何解释这条道路。您想要的与标准PathPathBuf解释事物的方式不同,因为尾随的/几乎被忽略。但是我看不出用一个简单的path.ends_with('/')来检查是否需要一个文件或目录有什么错。
如果你想根据尾部斜杠的存在来路由到不同的处理程序,那么你是对的,.route()模式不直接支持这一点。手动处理区别。

相关问题