Адаптировано в основном дословно из примера rocket_contrib .
Автомобиль go .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"
к вашему маршруту - Используйте
Deserialize
с serde
вместо 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<>
для некоторых из них.