无法在 Rocket 中将 HTTP URL 作为查询参数处理

问题描述

我正在使用 Rocket 创建一个基本的 Web api 来练习和提高我的 Rust 编程技能。

我卡在这里了。

#[post("/make/<link>")]
fn shorten_link(link: String) -> String {
    // Some other code
}

问题是当我发帖说 http://localhost:8000/make/https://youtube.com/ 时,我被重定向到 Rocket 404 页面,但是当我执行类似 http://localhost:8000/make/hello 的操作时,一切正常。我不明白我在这里做错了什么,所以任何帮助将不胜感激,谢谢。

解决方法

问题是网址 / 中的 https://youtube.com/ 被误解了。具体来说,它们被解释为路径的新段。例如,如果我请求 /seg1/seg2/seg3,我不希望用 #[get("/seg1/<arg>")] 注释的处理程序匹配该路径,因为它的末尾有一个额外的段。同样,/ 中的 https://youtube.com/ 被解释为新的路径段,因此不会命中您的处理程序。

我想到的第一个解决方案是像这样重写处理程序:

#[post("/make/<link..>")]
fn shorten_link(link: PathBuf) -> String {
    let link = link.to_str().unwrap(); // Don't actually unwrap

    // Other code
}

我认为这行得通,因为它需要一大堆路径段,然后把它变成一个字符串,但这不起作用,因为 Rocket 抱怨你不能用 {{1 }}。

所以我只是尝试了 URL 格式化 :,它在没有对处理程序进行任何修改的情况下工作。 URL 格式是您使用对 HTTP 不安全或具有不同含义的符号(在我们的示例中为 https://youtube.com//),然后将它们替换为合适的特殊代码.例如,: 的 URL 编码版本是 https://youtube.com/。最后一个请求是对 https%3A%2F%2Fyoutube.com%2F 的 POST 请求:

/make/https%3A%2F%2Fyoutube.com%2F

您可以使用 urlencoding crate 为您编码 URL。

编辑: 我的完整代码如下(这只是一个简单的测试):

client.post(format!(
    "/make/{}",urlencoding::encode("https://youtube.com/"),));