Cómo usar httpResource() en Angular para manejar peticiones HTTP
httpResource() — Resource API para HTTP: Peticiones Reactivas con Signals
¿Te imaginas definir una petición HTTP como si fuera una variable y olvidarte de orquestar cancelaciones, estados y subscriptions? Eso es lo que propone httpResource() — Resource API para HTTP: defines los parámetros como señales y el recurso se actualiza solo cuando cambian las señales dependientes.
Tiempo estimado de lectura: 3 min
- Convierte llamadas de red en estado reactivo accesible desde Signals.
- Automatiza cancelaciones y recargas cuando las señales dependientes cambian.
- Reduce boilerplate respecto al patrón Observable + suscripción para patrones “estado → petición”.
- No reemplaza a RxJS para orquestaciones temporales o streams continuos.
Introducción
httpResource() convierte llamadas de red en estado reactivo. Si trabajas con Angular y Signals, esto no es una mejora cosmética: es una forma distinta de pensar la carga de datos. En lugar de construir Observables, suscribirte y gestionar cancelaciones manuales, consumes estado.
Resumen rápido (lectores con prisa)
Definición: httpResource() expone peticiones HTTP como señales reactivas que actualizan automáticamente su estado al cambiar dependencias.
Cuándo usarlo: Para cargas impulsadas por estado (filtros, rutas, paginación).
Por qué importa: Simplifica cancelaciones automáticas, estados y recargas sin boilerplate.
Limitación clave: No sustituye a RxJS para orquestación temporal o streams continuos.
httpResource() — Resource API para HTTP: qué es y por qué importa
La Resource API expone operaciones asíncronas como señales. httpResource() es la implementación para peticiones HTTP: envuelve la llamada y te devuelve señales listas para consumir (value, loading, error, status y un método reload).
Angular documenta el enfoque reactividad en su guía oficial (ver Reactive primitives). El HttpClient sigue siendo el motor de la petición; httpResource() es la interfaz que lo conecta con Signals.
Actualmente la API está en Developer Preview en las versiones recientes, por lo que conviene probar con criterio en proyectos que puedan tolerar cambios en la firma antes de que se estabilice.
Cómo funciona, sin demasiada magia
Piensa en httpResource() como un computed() que hace fetch. Definís una función que lee señales. Angular registra dependencias. Cuando cualquiera cambia:
- la petición anterior se aborta si aún está en curso,
- se lanza una nueva petición con los parámetros actualizados,
- las señales (
value,isLoading,error,status) reflejan el ciclo de vida automáticamente.
Ejemplo mínimo
readonly userId = signal(1);
readonly userResource = httpResource(() => ({
url: `/api/users/${this.userId()}`,
method: 'GET'
}));
Cambia userId() y el recurso hace el resto. No hay switchMap, no hay takeUntil, no hay memoria de suscripciones.
Qué recibes “de serie” y por qué eso importa
Al usar httpResource() obtienes señales listas para consumir en la plantilla o en lógica reactiva:
- .value() — datos resueltos.
- .isLoading() — booleano para spinners/skeletons.
- .error() — información del fallo.
- .status() — idle | loading | resolved | error.
- .reload() — fuerza una re-ejecución.
Esto elimina mucho boilerplate: ya no necesitas declarar isLoading, data, error y actualizar cada uno en handlers separados.
Race conditions: ya no es una preocupación recurrente
Las condiciones de carrera eran el talón de Aquiles cuando el usuario cambiaba filtros rápido y una respuesta tardía pisaba datos nuevos. Con httpResource() la cancelación es automática: si la señal que define la petición cambia, las peticiones intermedias se abortan. Resultado: datos consistentes y menos código defensivo.
Eso no significa que el problema desaparezca en todos los contextos, pero sí que desaparece en el patrón más común: “estado cambia → cargar datos para la vista”.
Cuándo usarlo — y cuándo no
Usos recomendados
- La obtención de datos está impulsada por estado (filtros, ruta, paginación).
- Quieres minimizar boilerplate y unificar el modelo mental del equipo en Signals.
- Buscas evitar errores por manejo manual de cancelaciones.
Cuándo no usarlo
- Necesitas orquestación compleja de eventos (WebSockets, SSE, streams continuos).
- Requieres transformaciones temporales avanzadas (
debounceTime, windowing, combinaciones complejas). - Estás construyendo pipelines de datos que dependen del tiempo y eventos más que del estado.
RxJS sigue siendo la herramienta correcta para flujos de eventos; httpResource() es la herramienta correcta para “estado → petición” limpio y declarativo.
Impacto arquitectónico real
El cambio más importante no es técnico: es mental. Cuando el equipo compra la narrativa Signals-first, los componentes y su testing se vuelven más simples. Menos suscripciones olvidadas. Menos efectos colaterales. Mejor onboarding para quien llega nuevo al repo.
No es magia: es coherencia. httpResource() reduce superficie para errores y acelera decisiones arquitectónicas sobre dónde debe vivir la lógica de carga de datos.
Recursos y siguientes pasos
– HttpClient (persistencia del motor)
Si estás en Angular 19+ y ya trabajas con Signals, empieza por prototipar una pantalla con httpResource() y compara la legibilidad, tests y bugs con la versión RxJS/HttpClient. No lo adoptes por moda: mídelo. Y si en el prototipo funciona, lo siguiente es reescribir un flujo real y ver cuántas líneas de código desaparecen.
Esto no acaba aquí: hay decisiones de testing, caching y error handling que merecen otra pieza. Si querés, escribo la segunda parte con patrones de testing y estrategias de cache para httpResource().
FAQ
¿Qué es exactamente httpResource()?
Es una implementación de la Resource API para peticiones HTTP que expone el resultado y el estado de la petición como señales reactivas. Envuelve el mecanismo del HttpClient y ofrece .value(), .isLoading(), .error(), .status() y .reload().
¿Cómo se integra con HttpClient?
El HttpClient sigue siendo el motor que efectúa las peticiones. httpResource() actúa como la interfaz declarativa que lee señales y delega la ejecución y cancelación al HttpClient.
¿Qué señales ofrece por defecto?
Provee .value() (datos), .isLoading() (booleano), .error() (detalle del fallo), .status() (idle | loading | resolved | error) y .reload().
¿El API cancela peticiones automáticamente?
Sí. Si la señal que define la petición cambia mientras una petición está en curso, la petición anterior se aborta automáticamente para evitar condiciones de carrera comunes.
¿Cuándo debo seguir usando RxJS?
Cuando necesitas orquestación compleja de eventos, streams continuos (WebSockets, SSE) o transformaciones temporales avanzadas (debounceTime, windowing, combinaciones complejas), RxJS sigue siendo la herramienta adecuada.
¿Es estable la API en producción?
La API estaba en Developer Preview en versiones recientes; conviene probar con criterio en proyectos que puedan tolerar cambios en la firma antes de adoptarla ampliamente en producción.
