【发布时间】:2021-08-20 17:18:24
【问题描述】:
我使用 Rust 和 Rocket 创建了一个与 swagger 配合使用的 REST API。 现在我正在尝试使用 React react-admin 来准确地使用这个 API。一切正常,直到我需要调用一个出现著名 X-Total-Count 问题的列表,而我无法解决它,可能是由于缺乏 Rust 经验。
这是消息 "HTTP 响应中缺少 X-Total-Count 标头。jsonServer 数据提供程序期望资源列表的响应包含此标头以及构建分页的结果总数。如果您是使用 CORS,您是否在 Access-Control-Expose-Headers 标头中声明了 X-Total-Count"
这是我的响应头
HTTP/1.1 200 OK
Content-Type: application/json
Server: Rocket
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Expose-Headers: x-total-count, content-length, server
Content-Length: 45
Date: Wed, 02 Jun 2021 04:38:21 GMT
我尝试了很多东西,在标题中附加 X-Total-Count: cant_registries 没有任何幸运
这是我的 main.rs。欢迎任何提示,帮助,修改。提前致谢
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use]
extern crate rocket;
#[macro_use]
extern crate rocket_okapi;
use rocket::request::Request;
use rocket::response::{self, Response, Responder};
use rocket::http::ContentType;
use rocket::http::Header;
use rocket::request::{Form, FromForm};
use rocket_contrib::json::Json;
use rocket_okapi::swagger_ui::*;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use rocket::http::Method;
use std::env;
use std::process::Command;
use rocket_cors::{
AllowedOrigins,
Cors, CorsOptions,
};
#[derive(Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
struct User {
user_id: u64,
username: String
}
// impl<'r> Responder<'r> for User {
// fn respond_to(self, _: &Request) -> response::Result<'r> {
// Response::build()
// .header(Header::new("X-Total-Count", "1"))
// .ok()
// }
// }
fn example_email() -> &'static str {
"test@example.com"
}
fn make_cors() -> Cors {
let allowed_origins = AllowedOrigins::some_exact(&[
"http://localhost:3000",
]);
CorsOptions { // 5.
allowed_origins,
expose_headers: [ "x-total-count", "content-length","server" ]
.iter()
.map(ToString::to_string)
.collect(),
allowed_methods: vec![Method::Get, Method::Post, Method::Patch].into_iter().map(From::from).collect(),
allow_credentials: false,
..Default::default()
}
.to_cors()
.expect("error while building CORS")
}
/// # Get all users
#[openapi]
#[get("/user")]
fn get_all_users() -> Json<Vec<User>> {
Json(vec![User {
user_id: 88,
username: "goja288".to_owned(),
}])
}
fn main() {
rocket::ignite()
.mount(
"/",
routes_with_openapi![
get_all_users,
],
)
.mount(
"/swagger-ui/",
make_swagger_ui(&SwaggerUIConfig {
url: "../openapi.json".to_owned(),
..Default::default()
}),
).attach(make_cors())
.launch();
}
【问题讨论】:
-
嗯,响应中的
X-Total-Count标头是否?您可能需要手动添加它。如果标头首先不存在,则 CORS 允许什么也不做。 -
感谢@OleksiiFilonenko 的回答。确切地说,现实是我不太了解如何添加它。我尝试各种事情。现在我再次阅读documentation,看看我是否可以实现它
标签: rust react-admin rust-rocket