0
点赞
收藏
分享

微信扫一扫

Rust - Rocket框架 -快速入门

苦茶如歌 2022-03-11 阅读 83

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

举报

相关推荐

0 条评论