尝试在 rust api 上实现 rocket_cors CorsOptions
Trying to implement rocket_cors CorsOptions on a rust api
我是 Rust 的新手,我正在使用 rocket 创建一个简单的 CRUD API,我稍后想将其放在 AWS EC2 存储桶上。我有一个或两个基本路线,我想开始实施 CORS,以便 React 应用程序可以调用我的 API。我已经尝试了多个教程和示例,但我仍然卡住了。
我看过的教程:
- https://www.steadylearner.com/blog/read/How-to-use-CORS-and-OPTIONS-HTTP-request-with-Rust-Rocket
- https://docs.rs/rocket/0.3.6/rocket/fairing/trait.Fairing.html
[dependencies]
rocket = "0.4.6"
rocket_codegen = "0.4.6"
rocket_cors = "0.5.1"
diesel = "1.4.5"
dotenv = "0.15.0"
serde = "1.0.117"
serde_json = "1.0.59"
serde_derive = "1.0.117"
chrono = "0.4.19"
[dependencies.rocket_contrib]
version = "*"
default-features = false
features = ["json"]
我的文件作为代码片段附上
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate serde_derive;
use std::error::Error;
use rocket::http::Method;
use rocket_cors::{AllowedHeaders, AllowedOrigins};
use rocket_contrib::json::Json;
mod notes;
mod user_creds;
use notes::Notes;
use user_creds::UserCreds;
#[get("/api/v1/db/read")]
fn read_db() -> &'static str {
"reading"
}
#[get("/api/v1/govee")]
fn govee() -> &'static str {
"Hello, govee!"
}
#[post("/api/v1/db/notes", format = "json", data = "<notes>")]
fn get_notes(notes: Json<Notes>) -> Json<Notes> {
notes
}
#[post("/api/v1/login", format = "json", data = "<user_creds>")]
fn login(user_creds: Json<UserCreds>) -> Json<UserCreds> {
println!(
"user creds, {}, {}",
user_creds.username, user_creds.password
);
user_creds
}
fn main() {
let allowed_origins = AllowedOrigins::some_exact(&["http://localhost:8080"]);
// You can also deserialize this
let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
allowed_headers: AllowedHeaders::some(&["Authorization", "Accept"]),
allow_credentials: true,
..Default::default()
}
.to_cors();
rocket::ignite()
.mount("/", routes![read_db])
.attach(cors)
.launch();
}
link 中的错误图像:
CorsOptions::to_cors
return 是一个 Result
,这意味着它可能 return 一个错误。您必须先处理该错误,然后才能将其用作 Fairing
:
let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
allowed_headers: AllowedHeaders::some(&["Authorization", "Accept"]),
allow_credentials: true,
..Default::default()
}
.to_cors()
// panic if there was an error
.expect("error creating CORS fairing");
现在您可以将它作为整流罩附加:
rocket::ignite()
.mount("/", routes![read_db])
.attach(cors)
.launch();
我是 Rust 的新手,我正在使用 rocket 创建一个简单的 CRUD API,我稍后想将其放在 AWS EC2 存储桶上。我有一个或两个基本路线,我想开始实施 CORS,以便 React 应用程序可以调用我的 API。我已经尝试了多个教程和示例,但我仍然卡住了。
我看过的教程:
- https://www.steadylearner.com/blog/read/How-to-use-CORS-and-OPTIONS-HTTP-request-with-Rust-Rocket
- https://docs.rs/rocket/0.3.6/rocket/fairing/trait.Fairing.html
[dependencies]
rocket = "0.4.6"
rocket_codegen = "0.4.6"
rocket_cors = "0.5.1"
diesel = "1.4.5"
dotenv = "0.15.0"
serde = "1.0.117"
serde_json = "1.0.59"
serde_derive = "1.0.117"
chrono = "0.4.19"
[dependencies.rocket_contrib]
version = "*"
default-features = false
features = ["json"]
我的文件作为代码片段附上
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate serde_derive;
use std::error::Error;
use rocket::http::Method;
use rocket_cors::{AllowedHeaders, AllowedOrigins};
use rocket_contrib::json::Json;
mod notes;
mod user_creds;
use notes::Notes;
use user_creds::UserCreds;
#[get("/api/v1/db/read")]
fn read_db() -> &'static str {
"reading"
}
#[get("/api/v1/govee")]
fn govee() -> &'static str {
"Hello, govee!"
}
#[post("/api/v1/db/notes", format = "json", data = "<notes>")]
fn get_notes(notes: Json<Notes>) -> Json<Notes> {
notes
}
#[post("/api/v1/login", format = "json", data = "<user_creds>")]
fn login(user_creds: Json<UserCreds>) -> Json<UserCreds> {
println!(
"user creds, {}, {}",
user_creds.username, user_creds.password
);
user_creds
}
fn main() {
let allowed_origins = AllowedOrigins::some_exact(&["http://localhost:8080"]);
// You can also deserialize this
let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
allowed_headers: AllowedHeaders::some(&["Authorization", "Accept"]),
allow_credentials: true,
..Default::default()
}
.to_cors();
rocket::ignite()
.mount("/", routes![read_db])
.attach(cors)
.launch();
}
link 中的错误图像:
CorsOptions::to_cors
return 是一个 Result
,这意味着它可能 return 一个错误。您必须先处理该错误,然后才能将其用作 Fairing
:
let cors = rocket_cors::CorsOptions {
allowed_origins,
allowed_methods: vec![Method::Get].into_iter().map(From::from).collect(),
allowed_headers: AllowedHeaders::some(&["Authorization", "Accept"]),
allow_credentials: true,
..Default::default()
}
.to_cors()
// panic if there was an error
.expect("error creating CORS fairing");
现在您可以将它作为整流罩附加:
rocket::ignite()
.mount("/", routes![read_db])
.attach(cors)
.launch();