gpt4 book ai didi

http - 如何为 Rocket.rs 设置 CORS 或 OPTIONS

转载 作者:行者123 更新时间:2023-12-03 03:04:01 27 4
gpt4 key购买 nike

我有一个运行 Rocket.rs 的后端,我的 Flutter Web 应用程序向它发送请求,但它无法通过 OPTIONS 响应。

我尝试将 CORS (rocket_cors) 添加到后端并获得选项响应,但它仍然发回:

Error: XMLHttpRequest error.
dart:sdk_internal 124039:30 get current
packages/http/src/browser_client.dart.lib.js 214:124 <fn>

我在我的火箭项目中添加了以下内容:

#[options("/")]
fn send_options<'a>(path: PathBuf) -> Response<'a> {
let mut res = Response::new();
res.set_status(Status::new(200, "No Content"));
res.adjoin_header(ContentType::Plain);
res.adjoin_raw_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
res.adjoin_raw_header("Access-Control-Allow-Origin", "*");
res.adjoin_raw_header("Access-Control-Allow-Credentials", "true");
res.adjoin_raw_header("Access-Control-Allow-Headers", "Content-Type");
res

我的颤振应用程序正在运行这个请求:
Future<String> fetchData() async {
final data2 = await http.get("http://my-web-site.com").then((response) { // doesn't get past here
return response.body;
});
return data2;
}

问题:这是响应 OPTION 请求的正确方法吗?如果不是,我如何在 Rocket.rs 中实现它?

最佳答案

为了让服务器提供外部 API,它需要能够处理跨域资源共享 (CORS)。 CORS 是一种基于 HTTP header 的机制,它允许服务器指示浏览器应允许加载资源的来源(域、协议(protocol)或端口)。
您可以创建一个整流罩来为您的应用程序全局处理 CORS。一个非常宽松的版本如下,但当然,您必须根据您的特定应用程序进行定制。
火箭0.4

use rocket::http::Header;
use rocket::{Request, Response};
use rocket::fairing::{Fairing, Info, Kind};

pub struct CORS;

impl Fairing for CORS {
fn info(&self) -> Info {
Info {
name: "Add CORS headers to responses",
kind: Kind::Response
}
}

fn on_response(&self, request: &Request, response: &mut Response) {
response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
response.set_header(Header::new("Access-Control-Allow-Methods", "POST, GET, PATCH, OPTIONS"));
response.set_header(Header::new("Access-Control-Allow-Headers", "*"));
response.set_header(Header::new("Access-Control-Allow-Credentials", "true"));
}
}
火箭0.5
use rocket::http::Header;
use rocket::{Request, Response};
use rocket::fairing::{Fairing, Info, Kind};

pub struct CORS;

#[rocket::async_trait]
impl Fairing for CORS {
fn info(&self) -> Info {
Info {
name: "Add CORS headers to responses",
kind: Kind::Response
}
}

async fn on_response<'r>(&self, _request: &'r Request<'_>, response: &mut Response<'r>) {
response.set_header(Header::new("Access-Control-Allow-Origin", "*"));
response.set_header(Header::new("Access-Control-Allow-Methods", "POST, GET, PATCH, OPTIONS"));
response.set_header(Header::new("Access-Control-Allow-Headers", "*"));
response.set_header(Header::new("Access-Control-Allow-Credentials", "true"));
}
}
你只需要像这样连接整流罩:
rocket::ignite().attach(CORS)
或者,您可以使用 rocket_cors 箱。
use rocket::http::Method;
use rocket_cors::{AllowedOrigins, CorsOptions};

let cors = CorsOptions::default()
.allowed_origins(AllowedOrigins::all())
.allowed_methods(
vec![Method::Get, Method::Post, Method::Patch]
.into_iter()
.map(From::from)
.collect(),
)
.allow_credentials(true);

rocket::ignite().attach(cors.to_cors().unwrap())
您可以了解有关 CORS 和访问控制 header 的更多信息 here

关于http - 如何为 Rocket.rs 设置 CORS 或 OPTIONS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62412361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com