Rust + Rocket: как мне прочитать тело POST из запроса как строку? - PullRequest
0 голосов
/ 07 августа 2020

Я создаю простой 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();
}

1 Ответ

1 голос
/ 08 августа 2020

Обработка данных тела , как и большая часть Rocket, ориентирована на тип. Чтобы указать, что обработчик ожидает данных тела, аннотируйте его с помощью data = "", где param - аргумент в обработчике. Тип аргумента должен реализовывать черту FromData. Это выглядит так, где предполагается, что T реализует FromData:

#[post("/", data = "<input>")]
fn new(input: T) { /* .. */ }

, поэтому вам просто нужно создать тип, который реализует FromDataSimple или FromData

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...