Я создаю простой REST API, используя Rust и Rocket. Одна из конечных точек принимает запрос метода POST и считывает большую строку из тела запроса. Я не могу понять, как это сделать с помощью Rocket.
В документации описывается, как читать объект JSON из тела запроса POST, а также как читать составные данные формы, но не сырая строка. Кто-нибудь знает, как это сделать?
Обновление:
Следуя совету из ответа Дейва ниже, я реализовал трейт FromDataSimple, чтобы попытаться проанализировать тело запроса. Это то, что я реализовал, но это привело только к получению ответа «404 Not Found»:
struct Store {
contents: String,
}
impl FromDataSimple for Store {
type Error = String;
fn from_data(req: &Request, data: Data) -> data::Outcome<Self, String> {
let mut contents = String::new();
if let Err(e) = data.open().take(256).read_to_string(&mut contents) {
return Failure((Status::InternalServerError, format!("{:?}", e)));
}
Success(Store { contents })
}
}
#[post("/process", format = "application/json", data = "<input>")]
fn process_store(input: Store) -> &'static str {
"200 Okey Dokey"
}
К сожалению, когда я запускаю это, а затем проверяю его со следующим запросом, я просто получаю Ответ 404 Not Found: - (
curl -X POST -H "Content-Type: application/json" --data "{ \"contents\": \"testytest\"}" http://localhost:8080/process
Обновление 2:
На самом деле это работает, я просто забыл смонтировать метод в обработчиках маршрутизации:
fn main() {
rocket::ignite().mount("/", routes![index, process_store]).launch();
}