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/:idsegments.