🐛 Corrige orden de extractores en handlers

`HttpRequest` vacía `parts.extensions` al extraerse; `Path<T>` y otros
extractores que dependen de ellas deben declararse antes en el handler.
Corregido en el ejemplo hello-name y documentado en HttpRequest.
This commit is contained in:
Manuel Cillero 2026-07-04 22:58:45 +02:00
parent 8aa4372bdf
commit aa8b109668
2 changed files with 21 additions and 1 deletions

View file

@ -9,8 +9,8 @@ impl Extension for HelloName {
} }
async fn hello_name( async fn hello_name(
request: HttpRequest,
web::Path(name): web::Path<String>, web::Path(name): web::Path<String>,
request: HttpRequest,
) -> Result<Markup, ErrorPage> { ) -> Result<Markup, ErrorPage> {
Page::new(request) Page::new(request)
.with_child(Html::with(move |_| { .with_child(Html::with(move |_| {

View file

@ -61,6 +61,26 @@ use std::task::{Context, Poll};
/// // ... /// // ...
/// } /// }
/// ``` /// ```
///
/// # Orden de parámetros en el *handler*
///
/// `HttpRequest` toma las extensiones de la petición al extraerse. Los extractores que leen de ahí
/// (como `Path<T>` o `Extension<T>`) deben aparecer **antes** en la lista de parámetros del
/// *handler*:
///
/// ```rust,no_run
/// # use pagetop::prelude::*;
/// // Correcto: Path<T> se declara antes que HttpRequest.
/// async fn view_post(
/// web::Path(id): web::Path<u32>,
/// request: HttpRequest,
/// ) -> Result<Markup, ErrorPage> {
/// # todo!()
/// }
/// ```
///
/// Los extractores que no dependen de las extensiones, como `Query<T>` o `Method`, no están sujetos
/// a esta restricción.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct HttpRequest { pub struct HttpRequest {
uri: http::Uri, uri: http::Uri,