Rust と Rocket を使用して単純な REST API を構築しています。エンドポイントの 1 つは POST メソッド要求を受け入れ、要求本文から大きな文字列を読み取ります。ロケットでこれを行う方法がわかりません。
このドキュメントでは、POST リクエストの本文から JSON オブジェクトを読み取る方法と、生の文字列ではなくマルチパート フォーム データを読み取る方法について説明しています。誰もこれを行う方法を知っていますか?
アップデート:
以下の Dave の回答のアドバイスに従って、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"
}
残念ながら、これを実行してから次の要求で ping を実行すると、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();
}