如何使用 Rocket 响应包含 JSON 数据的 POST 请求?
How can I respond to a POST request containing JSON data with Rocket?
我正在尝试使用 Rocket crate:
创建后端
fn main() {
rocket::ignite().mount("/", routes![helloPost]).launch();
}
#[derive(Debug, PartialEq, Eq, RustcEncodable, FromForm)]
struct User {
id: i64,
USR_Email: String,
USR_Password: String,
USR_Enabled: i32,
USR_MAC_Address: String
}
#[post("/", data = "<user_input>")]
fn helloPost(user_input: Form<User>) -> String {
println!("print test {}", user_input);
}
当我 运行 cargo run
一切正常但是,当我向邮递员发送 POST 请求进行测试时,我收到此错误:
POST /:
=> Matched: POST / (helloPost)
=> Warning: Form data does not have form content type.
=> Outcome: Forward
=> Error: No matching routes for POST /.
=> Warning: Responding with 404 Not Found catcher.
=> Response succeeded.
我已将 header 内容类型设置为 JSON 以及适用于其他语言的内容类型,但使用 Rocket 我无法让它工作。
这是我的 JSON body:
{
"USR_Email": "test@test.it",
"USR_Password": "500rockets",
"USR_Enabled": 0,
"USR_MAC_Address": "test test"
}
如何解决这个问题?
基本上逐字改编自 rocket_contrib example。
Cargo.toml:
<snip>
[dependencies]
rocket = "0.4.2"
rocket_contrib = "0.4.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
src/main.rs:
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
use rocket_contrib::json::Json;
use serde::Deserialize;
#[derive(Debug, PartialEq, Eq, Deserialize)]
struct User {
id: i64,
USR_Email: String,
USR_Password: String,
USR_Enabled: i32,
USR_MAC_Address: String
}
#[post("/", format = "json", data = "<user_input>")]
fn helloPost(user_input: Json<User>) -> String {
format!("print test {:?}", user_input)
}
fn main() {
rocket::ignite().mount("/hello", routes![helloPost]).launch();
}
一些注意事项:
- 使用
Json
代替Form
- 将
format = "json"
添加到您的路线
- 使用
serde
中的 Deserialize
而不是 RustcEncodable
。 Serde 早已取代 rustc_serialize 作为 Rust 的 序列化解决方案,而这正是 rocket_contrib 使用的。
使用 curl 进行测试:
$ curl -H 'Content-Type: application/json' \
--data '{"id": 123, "USR_Email": "abc@example.com", "USR_Password": "hunter2", "USR_Enabled": 1, "USR_MAC_Address": "ff:ff"}' \
http://localhost:8000/hello
print test Json(User { id: 123, USR_Email: "abc@example.com", USR_Password: "hunter2", USR_Enabled: 1, USR_MAC_Address: "ff:ff" })
请注意,User
中的每个字段都必须出现在 JSON 中,否则将引发 400 Bad Request
。您可能希望对其中一些使用 Option<>
。
我正在尝试使用 Rocket crate:
创建后端fn main() {
rocket::ignite().mount("/", routes![helloPost]).launch();
}
#[derive(Debug, PartialEq, Eq, RustcEncodable, FromForm)]
struct User {
id: i64,
USR_Email: String,
USR_Password: String,
USR_Enabled: i32,
USR_MAC_Address: String
}
#[post("/", data = "<user_input>")]
fn helloPost(user_input: Form<User>) -> String {
println!("print test {}", user_input);
}
当我 运行 cargo run
一切正常但是,当我向邮递员发送 POST 请求进行测试时,我收到此错误:
POST /:
=> Matched: POST / (helloPost)
=> Warning: Form data does not have form content type.
=> Outcome: Forward
=> Error: No matching routes for POST /.
=> Warning: Responding with 404 Not Found catcher.
=> Response succeeded.
我已将 header 内容类型设置为 JSON 以及适用于其他语言的内容类型,但使用 Rocket 我无法让它工作。
这是我的 JSON body:
{
"USR_Email": "test@test.it",
"USR_Password": "500rockets",
"USR_Enabled": 0,
"USR_MAC_Address": "test test"
}
如何解决这个问题?
基本上逐字改编自 rocket_contrib example。
Cargo.toml:
<snip>
[dependencies]
rocket = "0.4.2"
rocket_contrib = "0.4.2"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
src/main.rs:
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
use rocket_contrib::json::Json;
use serde::Deserialize;
#[derive(Debug, PartialEq, Eq, Deserialize)]
struct User {
id: i64,
USR_Email: String,
USR_Password: String,
USR_Enabled: i32,
USR_MAC_Address: String
}
#[post("/", format = "json", data = "<user_input>")]
fn helloPost(user_input: Json<User>) -> String {
format!("print test {:?}", user_input)
}
fn main() {
rocket::ignite().mount("/hello", routes![helloPost]).launch();
}
一些注意事项:
- 使用
Json
代替Form
- 将
format = "json"
添加到您的路线 - 使用
serde
中的Deserialize
而不是RustcEncodable
。 Serde 早已取代 rustc_serialize 作为 Rust 的 序列化解决方案,而这正是 rocket_contrib 使用的。
使用 curl 进行测试:
$ curl -H 'Content-Type: application/json' \
--data '{"id": 123, "USR_Email": "abc@example.com", "USR_Password": "hunter2", "USR_Enabled": 1, "USR_MAC_Address": "ff:ff"}' \
http://localhost:8000/hello
print test Json(User { id: 123, USR_Email: "abc@example.com", USR_Password: "hunter2", USR_Enabled: 1, USR_MAC_Address: "ff:ff" })
请注意,User
中的每个字段都必须出现在 JSON 中,否则将引发 400 Bad Request
。您可能希望对其中一些使用 Option<>
。