标签: rust-rocket

在 Rocket 中返回 HTTP 状态不是 200 的 JSON

我希望我的 Rocket API 有这样的路线:

#[post("create/thing", format = "application/json", data="<thing>")]
Run Code Online (Sandbox Code Playgroud)

当客户端发送时{ "name": "mything" },一切都应该没问题,我知道该怎么做,但是当它发送时,{ "name": "foo" }它应该响应如下:

#[post("create/thing", format = "application/json", data="<thing>")]
Run Code Online (Sandbox Code Playgroud)
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)

我如何以 JSON 对象和与 Rocket 中的 200 不同的 HTTP 状态代码之类的结果进行响应?

这是我到目前为止尝试过的:

  • impl FromRequest对于我的Thing类型。这让我可以选择一个状态代码,因为我可以编写自己的from_request函数,但我不能返回任何其他内容。
  • 这个例子中注册一个错误捕获器,但这样我只能对一个没有上下文的 HTTP 状态代码做出反应。我有太多的失败模式,无法为每个模式保留一个 HTTP 状态代码。

rest rust rust-rocket

14
推荐指数
2
解决办法
2863
查看次数

如何将在 main 中初始化的变量传递给 Rocket 路由处理程序?

我有一个在main(第 9 行)中初始化的变量,我想在我的一个路由处理程序中访问对这个变量的引用。

#[get("/")]
fn index() -> String {
    return fetch_data::fetch(format!("posts"), &redis_conn).unwrap(); // How can I get redis_conn?
}

fn main() {
    let redis_conn = fetch_data::get_redis_connection(); // initialized here

    rocket::ignite().mount("/", routes![index]).launch();
}
Run Code Online (Sandbox Code Playgroud)

在其他语言中,这个问题可以通过使用全局变量来解决。

rust rust-rocket

12
推荐指数
1
解决办法
1420
查看次数

“Hello world”Rust 网络服务器从 Chrome 而非 curl 测量时比 Node 慢

我创建了一个存储库,其中包含基于 Node.js和基于Rocket.rs 的Web 服务器。

考虑以下步骤:

  1. 通过以下方式启动 Rocket.rs 服务器 cargo run --release
  2. 通过以下方式启动 Node.js 服务器 node server.js
  3. 在 Chrome 中并排打开 http://localhost:8000/ (Rocket) 和 http://localhost:8090/ (Node)。
  4. 打开开发者控制台后,我不断刷新两个选项卡,并观察到 ​​Node 选项卡总是在 5 毫秒内完成,而火箭选项卡有时需要超过 300 毫秒才能完成:

在此处输入图片说明

我也用 actix-web 观察到类似的事情,但程度较小:在这种情况下,如果我没有刷新选项卡大约 5 秒,我只会得到大约 300 毫秒的延迟。如果我不断刷新它,那么请求会在 5 毫秒内完成。

有趣的是,延迟似乎如果我通过像袅袅衡量不会出现这种。我的两台服务器都有大约 4 毫秒的延迟。

我注意到 Rocket 和 actix-web 不会在他们的响应中发送 Keep-Alive 标头。如果我理解正确,这对于 HTTP 1.1 请求应该无关紧要。

我正在使用安装了 Ubuntu 的 WSL 2。Chrome 在主机 Windows 中运行。

有人可以解释一下这里发生了什么吗?

更新:忘了说我是使用夜间编译器来构建火箭服务器的(Rocket v0.4.6 似乎需要它)。直接从主分支更改为稳定和构建摆脱了延迟。尽管如此,actix-web 延迟仍然有点令人担忧,因为我使用了稳定的编译器。

performance latency node.js rust rust-rocket

11
推荐指数
1
解决办法
469
查看次数

安装最新的 rust nightly 抱怨缺少 rls 组件

尝试编译:https://github.com/SergioBenitez/Rocket/tree/master/examples/hello

Cargo.toml

[dependencies]
rocket = "0.4.10"
Run Code Online (Sandbox Code Playgroud)

抱怨我每晚都需要 Rust

$ cargo build
...
  Error: Rocket (core) requires a more recent version of rustc.
  Installed version: 1.54.0 (2021-05-17)
  Minimum required:  1.54.0-nightly (2021-05-18)
Run Code Online (Sandbox Code Playgroud)

我已经完成了本地目录覆盖

$ rustup override set nightly
Run Code Online (Sandbox Code Playgroud)

我每晚运行 2021-05-17 但我需要 2021-05-18

$ rustup show
...
active toolchain
----------------

nightly-x86_64-unknown-linux-gnu (directory override for '/<redacted>')
rustc 1.54.0-nightly (3e99439f4 2021-05-17)
Run Code Online (Sandbox Code Playgroud)

我尝试了各种命令来获取更新的每晚

$ rustup update
$ rustup update nightly
$ rustup toolchain install nightly-2021-05-18
Run Code Online (Sandbox Code Playgroud)

当我这样做的时候,会发生一些奇怪的事情rustup update nightly

$ rustup update nightly 
info: syncing …
Run Code Online (Sandbox Code Playgroud)

nightly-build rust rust-language-server rust-rocket

11
推荐指数
1
解决办法
5126
查看次数

如何从 Rust (Rocket) HTTP 端点返回 JSON?

在 Rust 中通过 Rocket 返回 Json 最简单的方法是什么?

#[post("/route", data = "<data>")]
fn route(someVariable: String) -> String {
    // How can I return a json response here? {"a": "{someVariable}")
}
Run Code Online (Sandbox Code Playgroud)

我尝试过:content::Json()但对我来说似乎太静态了。

rust rust-rocket

9
推荐指数
1
解决办法
8927
查看次数

我可以在 Rocket 中使用 async fn 作为处理程序吗?

我正在使用 Rocket 框架,我想在我的处理程序中发出一个异步 HTTP 请求,就像这样

#[get("/")]
async fn handler() -> String {
  some_func().await;
  "OK".into()
}
Run Code Online (Sandbox Code Playgroud)

结果,我得到了下一个错误

#[get("/")]
async fn handler() -> String {
  some_func().await;
  "OK".into()
}
Run Code Online (Sandbox Code Playgroud)

我试图编写实现但失败了。有没有办法为 impl Trait 实现 trait?

或者可以指定 async fn 的返回类型,以便我可以返回实现了必要特征的自定义类型?

traits rust async-await rust-rocket

8
推荐指数
1
解决办法
3084
查看次数

尽管 Rocket 和 serde 都列为依赖项,但无法使用 Rocket::serde::json::Json

我按照快速入门指南进行操作。现在我试图返回一些超级简单的 JSON,但文档是错误的,并且无法在不进入 IRC 的情况下提交票证。

错误

error[E0432]: unresolved import `rocket::serde::json`
 --> src/main.rs:2:20
  |
2 | use rocket::serde::json::Json;
  |                    ^^^^ could not find `json` in `serde`

For more information about this error, try `rustc --explain E0432`.
error: could not compile `my-api` due to previous error
Run Code Online (Sandbox Code Playgroud)

文件

Cargo.toml

[package]
name = "my-api"
version = "0.1.0"
edition = "2021"
publish = false

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rocket = "0.5.0-rc.1"
serde = "1.0.130"
Run Code Online (Sandbox Code Playgroud)

main.rs

[package]
name = …
Run Code Online (Sandbox Code Playgroud)

rust rust-rocket

8
推荐指数
1
解决办法
4513
查看次数

JSON 响应的反序列化在字符串中保留引号

我正在使用 reqwest 查询 Google API:

let request_url = format!(
    "https://maps.googleapis.com/maps/api/place/findplacefromtext/json?input=*\
     &inputtype=textquery\
     &fields=formatted_address,name,place_id,types\
     &locationbias=circle:50@{},{}\
     &key=my-secret-key",
    lat, lng
);

let mut response = reqwest::get(&request_url).expect("pffff");

let gr: GoogleResponse = response.json::<GoogleResponse>().expect("geeez");
Run Code Online (Sandbox Code Playgroud)

GoogleResponse结构体定义为

#[derive(Debug, Serialize, Deserialize)]
pub struct DebugLog {
    pub line: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Candidate {
    pub formatted_address: String,
    pub name: String,
    pub place_id: String,
    pub types: Vec<String>,
}

#[derive(Debug, Serialize, Deserialize)]
pub struct GoogleResponse {
    pub candidates: Vec<Candidate>,
    pub debug_log: DebugLog,
    pub status: String,
}
Run Code Online (Sandbox Code Playgroud)

这一切都会编译,我可以发出请求,但是我在字段中得到的结果String …

serialization json rust serde rust-rocket

7
推荐指数
1
解决办法
3858
查看次数

为什么我发布的端口不起作用?

我创建了一个 docker 镜像,其中包含一个 rust 应用程序,该应用程序响应端口 8000 上的获取请求。应用程序本身是一个使用火箭库 ( https://rocket.rs/ )的基本示例,它看起来像这样

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}
Run Code Online (Sandbox Code Playgroud)

我已经编译了这个并称之为 server

然后我创建了一个 Docker 文件来托管它

FROM ubuntu:16.04

RUN apt-get update; apt-get install -y curl

COPY server /root/

EXPOSE 8000

CMD ["/root/server"]                           
Run Code Online (Sandbox Code Playgroud)

我构建 docker 镜像 $ docker build -t port_test并运行它$ docker run -p 8000:8000 port_test

在这一点上,一切看起来都不错

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED                     STATUS              PORTS                    NAMES …
Run Code Online (Sandbox Code Playgroud)

networking curl rust docker rust-rocket

6
推荐指数
2
解决办法
770
查看次数

如何从 Rocket 中的请求中检索 HTTP 标头?

我会在Python中使用flask做这样的事情:

@app.route('/login/', methods=['POST'])
def login():
    token = request.headers["token"]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何访问token标头并将其存储为String变量。

#![feature(proc_macro_hygiene, decl_macro)]

use rocket::{
    config::{Config, Environment},
    *,
};

fn main() {
    let config = Config::build(Environment::Production)
        .address("0.0.0.0")
        .port(PORT)
        .finalize()
        .unwrap();

    rocket::ignite().mount("/", routes![login]).launch();
}

#[post("/login")]
fn login() {

    // Retrieve headers from request.
}
Run Code Online (Sandbox Code Playgroud)

http-headers rust rust-rocket

6
推荐指数
2
解决办法
5362
查看次数