Skip to content

Funciones de Creación de Comunicación HTTP ​

RxJS proporciona Funciones de Creación para manejar la comunicación HTTP como Observable. Esta sección describe dos funciones, ajax() y fromFetch(), en detalle.

¿Qué son las Funciones de Creación de Comunicación HTTP? ​

Las Funciones de Creación de Comunicación HTTP son un conjunto de funciones que permiten manejar la comunicación con APIs externas y servidores como un flujo Observable. Al usar estas funciones, la comunicación HTTP asíncrona puede integrarse en la cadena de operadores de RxJS, y el manejo de errores y procesamiento de reintentos pueden describirse declarativamente.

Características Principales ​

  • Comunicación HTTP declarativa: Al tratar la comunicación HTTP como Observable, es posible el procesamiento declarativo usando operadores
  • Manejo de errores uniforme: Manejo de errores uniforme con operadores como catchError() y retry()
  • Cancelable: Las solicitudes pueden cancelarse con unsubscribe()
  • Integración con otros streams: Combinar con otros Observables via switchMap(), etc.

Lista de Funciones de Creación de Comunicación HTTP ​

FunciónDescripciónTecnología BaseUsos Principales
ajax()Comunicación HTTP basada en XMLHttpRequestXMLHttpRequestSoporte de navegadores legacy, monitoreo de progreso
fromFetch()Comunicación HTTP basada en Fetch APIFetch APINavegadores modernos, comunicación HTTP ligera

Comparación: ajax() vs fromFetch() ​

Diferencias Básicas ​

typescript
import { switchMap } from 'rxjs';
import { ajax } from 'rxjs/ajax';
import { fromFetch } from 'rxjs/fetch';

// ajax() - Parsea automáticamente la respuesta
const ajax$ = ajax.getJSON<Todo>('https://jsonplaceholder.typicode.com/todos/1');
ajax$.subscribe(data => console.log(data));

// fromFetch() - Parsear respuesta manualmente
const fetch$ = fromFetch('https://jsonplaceholder.typicode.com/todos/1').pipe(
  switchMap(response => response.json())
);
fetch$.subscribe(data => console.log(data));

interface Todo {
  userId: number;
  id: number;
  title: string;
  completed: boolean;
}

Tabla de Comparación de Características ​

Característicaajax()fromFetch()
Tecnología BaseXMLHttpRequestFetch API
Parseo JSON Automático✅ Soportado con getJSON()❌ Llamar .json() manualmente
Eventos de Progreso✅ Soportado❌ No soportado
Timeout✅ Soporte integrado❌ Requiere implementación manual
Detección Automática de Errores HTTP✅ Automáticamente error en 4xx/5xx❌ Requiere verificación manual de estado
Cancelación de Solicitud✅ Posible con unsubscribe()✅ Posible con unsubscribe()
Soporte IE11✅ Soportado❌ Requiere polyfill
Tamaño del BundleAlgo más grandeMás pequeño

Directrices de Uso ​

Cuándo Elegir ajax() ​

  1. Se requiere soporte de navegadores legacy

    • Cuando necesitas soportar navegadores antiguos como IE11
  2. Se requiere monitoreo de progreso

    • Cuando quieres mostrar el progreso de carga/descarga de archivos
  3. Obtención simple de JSON

    • Cuando quieres obtener JSON fácilmente con getJSON()
  4. Se necesita detección automática de errores

    • Cuando quieres usar detección automática de errores por código de estado HTTP

Cuándo Elegir fromFetch() ​

  1. Solo se soportan navegadores modernos

    • Cuando solo soportas entornos donde la Fetch API está disponible
  2. Quiere reducir el tamaño del bundle

    • Cuando una función de comunicación HTTP ligera es suficiente
  3. Quiere usar características de Fetch API

    • Cuando quieres manipular objetos Request/Response directamente
    • Cuando quieres usarlo en un Service Worker
  4. Necesita control fino

    • Cuando quieres personalizar el procesamiento de respuesta en detalle

Ejemplos de Uso Práctico ​

Patrón de Llamada API ​

typescript
import { of, catchError, retry, timeout } from 'rxjs';
import { ajax } from 'rxjs/ajax';

interface User {
  id: number;
  name: string;
  email: string;
}

// Patrón práctico usando ajax()
const fetchUser$ = ajax.getJSON<User>('https://api.example.com/users/1').pipe(
  timeout(5000), // Timeout después de 5 segundos
  retry(2), // Reintentar dos veces en caso de fallo
  catchError((error: unknown) => {
    console.error('Error al obtener usuario:', error);
    return of(null); // Retornar null en caso de error
  })
);

fetchUser$.subscribe({
  next: user => {
    if (user) {
      console.log('Usuario:', user);
    } else {
      console.log('Fallo al obtener usuario');
    }
  }
});

Patrón de Envío de Formulario ​

typescript
import { fromEvent, switchMap, map } from 'rxjs';
import { ajax } from 'rxjs/ajax';

// Convertir evento submit de formulario a Observable
const form = document.querySelector('form') as HTMLFormElement;
const submit$ = fromEvent(form, 'submit').pipe(
  map(event => {
    event.preventDefault();
    const formData = new FormData(form);
    return Object.fromEntries(formData.entries());
  }),
  switchMap(data =>
    ajax.post('https://api.example.com/submit', data, {
      'Content-Type': 'application/json'
    })
  )
);

submit$.subscribe({
  next: response => console.log('Envío exitoso:', response),
  error: error => console.error('Error de envío:', error)
});

Preguntas Frecuentes ​

P1: ¿Debo usar ajax() o fromFetch()? ​

R: Recomendamos fromFetch() si solo se soportan navegadores modernos. Las razones son las siguientes:

  • Fetch API es el último estándar web
  • Tamaño de bundle pequeño
  • Alta compatibilidad futura

Sin embargo, elige ajax() en los siguientes casos:

  • Se requiere soporte de IE11
  • Se requiere monitoreo de progreso
  • La obtención simple de JSON es suficiente

P2: ¿Cómo se manejan los errores HTTP (4xx, 5xx)? ​

R:

  • ajax(): Código de estado HTTP mayor a 400 se trata automáticamente como error y se llama el callback error
  • fromFetch(): Los errores HTTP aún activan el callback next. Necesitas verificar response.ok manualmente

P3: ¿Cómo cancelo una solicitud? ​

R: Ambos pueden cancelarse con unsubscribe().

typescript
const subscription = ajax.getJSON('/api/data').subscribe(...);

// Cancelar después de 3 segundos
setTimeout(() => subscription.unsubscribe(), 3000);

Próximos Pasos ​

Para uso detallado de cada función, consulta las siguientes páginas:

Recursos de Referencia ​

Publicado bajo licencia CC-BY-4.0.