如何解决无法在 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 举报,一经查实,本站将立刻删除。