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])//挂载
}
开端
请求方法
//例如
#[get("/")] //是不是和java的Spring框架的注解很像,其实它更加方便好用,让我们来慢慢了解它
动态路径
程序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
也会终止程序
// 请求 => 输出
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])
}
// 请求 => 输出
http://127.0.0.1:8000/cs/b/0 => i32:0
http://127.0.0.1:8000/cs/b/0/0 => 0/0/
http://127.0.0.1:8000/cs/b/abc => abc/
http://127.0.0.1:8000/cs/b/abc/123 => abc/123/
很明显,它并没有匹配到get_f1
,因为get_f3
优先级更高,且匹配成功
忽略段
就是字面意思,忽略一个或多个段
语法:
#[get("/a/<_>")] //忽略1个
#[get("/a/<_>/<_>")] //忽略2个
#[get("/a/<_>/c")] //忽略1个
#[get("/a/<_..>")] //忽略多个
请求守卫
请求守卫 顾名思义, 请求保护可防止处理程序根据传入请求中包含的信息被错误调用
请求守卫需要实现FromRequest
请求守卫总是按从左到右的声明顺序 进行验证,如果有一名守卫失败,则不会去尝试其他守卫
程序2
use std::path::PathBuf;
use rocket::http::{SameSite,CookieJar,Cookie};
use rocket::request::{self, Outcome, Request, FromRequest};
#[macro_use] extern crate rocket;
#[get("/<_..>")]
fn get_f1(ABC守卫:ABC) -> &'static str {
println!("get_f1:{}",ABC守卫.0);
"get_f1"
}
#[launch]
fn rocket() -> _ {
rocket::build()
.mount("/", routes![get_f1])
}
struct ABC(String);
#[rocket::async_trait]
impl<'r> FromRequest<'r> for ABC {
type Error = ();
async fn from_request(req: &'r Request<'_>) -> Outcome<Self, Self::Error> {
let uri_string = req.uri().to_string();
println!("ABC守卫{}", uri_string);
if uri_string == "/a/b/c"{
Outcome::Success(ABC("abc".to_string()))//成功
} else {
Outcome::Forward(())//转发
//Outcome::Failure() // 失败
}
}
}
//请求 => [输出1,输出2,...] => 响应
http://127.0.0.1:8000/a/b/c => [ABC守卫/a/b/c,get_f1:abc] => get_f1
http://127.0.0.1:8000/a/b => [ABC守卫/a/b] => 404
看起来和java的Srping框架的注入意思差不多,只不过Rocket主要是起到守卫作用
CookieJar是一个重要的内置请求守卫,它允许您获取、设置和删除 cookie