Query parameters

Read URL search params from FlowRequest in pages, loaders, and submits.

Single parameter

pub fn page(req: FlowRequest) -> View {
    let q = req.query_param("q").unwrap_or("");
    view! {
        <>
            <h1>"Search"</h1>
            <p>"Query: " {q.to_string()}</p>
        </>
    }
}

In loaders

#[load]
async fn search_results(req: &FlowRequest) -> Result<Vec<Item>, LoaderError> {
    let q = req.query_param("q").unwrap_or("");
    if q.is_empty() {
        return Ok(vec![]);
    }
    db::search(q).await.map_err(|_| LoaderError::new(500, "search failed"))
}

Forms that preserve query state

<form method="get" action="/docs/search">
    <input type="search" name="q" placeholder="Search docs…" />
</form>

Flash after redirect

Combine PRG redirects with a query flag:

#[submit]
async fn create(form: ItemForm, _req: &FlowRequest) -> Result<Redirect, SubmitError> {
    db::insert(&form).await.map_err(|_| SubmitError::new("Failed"))?;
    Ok(redirect("/items?created=1"))
}

pub fn page(req: FlowRequest) -> View {
    let created = req.query_param("created") == Some("1");
    view! {
        <>
            {if created {
                view! { <p class="toast">"Item created!"</p> }
            } else {
                View::empty()
            }}
        </>
    }
}

Parsing notes

  • Values are percent-decoded by the Flow request layer.
  • Duplicate keys: last value wins (same as typical query parsers).
  • Use path params (req.param(\"id\")) for /users/:id segments.