我目前正在使用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框架实现这一点?
1条答案
按热度按时间ddarikpa1#
你所拥有的将工作得很好,当使用一个隐藏模式时,完整的路径将被保留:
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
因此,这完全取决于你如何解释这条道路。您想要的与标准
Path
和PathBuf
解释事物的方式不同,因为尾随的/
几乎被忽略。但是我看不出用一个简单的path.ends_with('/')
来检查是否需要一个文件或目录有什么错。如果你想根据尾部斜杠的存在来路由到不同的处理程序,那么你是对的,
.route()
模式不直接支持这一点。手动处理区别。