微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决无法在 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/"),));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。