Roket官网
官方是english文档,看的很累~
新建项目
cargo new 项目名 --bin
Cargo.toml
[dependencies]
rocket = "0.5.0-rc.1"
Hello,world! src/main.rs
#[macro_use] extern crate rocket;
#[get("/")] // 路由属性
fn index() -> &'static str {
//请求处理程序
"Hello, world!"
}
#[launch]
fn rocket() -> _ {
rocket::build().mount("/", routes![index])//挂载
}
强烈建议使用
VSCode
+rust-analyzer
(插件) +Better TOML
(插件)
IDEA
的Rust
插件并不友好,瞎报错,你没错也报错,而且并不支持Rocket
框架的提示
开端
响应类型
响应类型必须实现 Responder(可派生)
#[get("/")]
fn index() -> T {
/* ... */ }//T 需要实现Responder
&str
,String
,&[u8]
,Vec<u8>
,File
,()
,Option<T>
,Result<T,E>
都实现了 Responder
请求方法
//例如
#[get("/")] //是不是和java的Spring框架的注解很像,其实它更加方便好用,让我们来慢慢了解它
动态路径
需要实现 FromParam,&str,String,bool,i32,…基本类型都实现了它
程序1
use std::path::PathBuf;
use rocket::{
request::FromRequest};
use rocket::http::{
SameSite,CookieJar,Cookie};
use rocket::Request;
#[macro_use] extern crate rocket;
#[get("/b/<a>" , rank = 3) ]
fn get_f1(a:&str) {
println!("str:{}",a);
}
#[get("/b/<a>", rank = 0 )]
fn get_f2(a:i32) {
println!("i32:{}",a);
}
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/cs", routes![get_f1,get_f2])
}
rank
属性越小越优先匹配
如果匹配失败,则去匹配下一个,官方把这种行为称呼为转发
如果相同路径下,省略了rank
就会终止程序,相同的rank
也会终止程序
需要注意的一点:
&str
不会拒绝任何匹配,比如:i32
会拒绝非数字字符串匹配,由于&str
本身就是字符串,所以它不会拒绝任何匹配.那么&str
的优先级应该小一点,给其他函数一个机会
// 请求 => 输出
http://127.0.0.1:8000/cs/b/0 => i32:0
http://127.0.0.1:8000/cs/b/abc => str:abc
我理解的不是很明白,就不来误导大家了,请看官方文档默认rank
匹配多个段
官方称呼为段守卫
段守卫
的类型必须实现 FromSegments
接着上面的程序1
,加入以下代码
#[get("/b/<a..>" , rank = 1)]
fn get_f3(a:PathBuf){
for b in a.iter() {
print!("{}/",b.to_str().unwrap());
}
}
//修改为:
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/cs", routes![get_f1,get_f2,get_f3])<