2

I am making a very simple web app using the rust Rocket framework. I have a very simple HTML file that has a form, as follows:

<form action="/search" method="post" accept-charset="utf-8">
    Search Term:<input type="text" name="searchterm">
    <input type="submit" value="search">
</form>

Next, here are my rocket functions to deal with the requests. I have a get function that spits out index.html when accessing "/", then for my form, I have the following functions:

#[derive(FromForm)]
pub struct Request<'r> {
    payload: &'r RawStr,
    // we can add more if we want later on, for other form options...
}

#[post("/search", data = "<data>")]
pub fn process(data: Form<Request>) -> Result<Redirect, String> {
    if data.payload == "Hello!" {
        Ok(Redirect::to("/search/Hello"))
    } else {
        Err(format!("Unknown search term, '{}'.", data.payload))
    }
}

Then, this is to response to the GET requests:

#[get("/search/<term>")]
pub fn response(term: &RawStr) -> String {
    format!("You typed in {}.", term)
}

Like I said, very simple, very barebones, just trying to tiptoe into both Rust and Web Apps at the same time. I do not have much experience in either. My issue is, when using the field presented to the user in my html file, the server returns an error:

POST /search application/x-www-form-urlencoded:
=> Matched: POST /search (process)
=> Error: The incoming form failed to parse.
=> Outcome: Failure
=> Warning: Responding with 422 Unprocessable Entity catcher.
=> Response succeeded.

If I go directly, to localhost:8000/search/Hello! I can see that my GET response works. But if I use my form it refuses to parse. What am I doing wrong? I am simply attempting to make a web app that takes an input, and based on that input, returns something. Website redirection, web scraping, I am not sure on the specifics of functionality yet, but I need to be able to type something into the form and obtain it for use in my rust code later. Any help would be appreciated!

kmdreko
  • 42,554
  • 6
  • 57
  • 106
Adrian Bernat
  • 65
  • 1
  • 9

1 Answers1

4

I think the problem is that your form parameter name (<input type="text" name="searchterm">) doesn't match with your struct field name (payload). If you rename one or the other so they would match, your form should work.

art-solopov
  • 4,289
  • 3
  • 25
  • 44