Skip to content

Creation Functions per la comunicazione HTTP

RxJS fornisce Creation Functions per gestire le comunicazioni HTTP come Observable. In questa sezione, verranno spiegate in dettaglio le due funzioni: ajax() e fromFetch().

Cosa sono le Creation Functions per la comunicazione HTTP

Le Creation Functions per la comunicazione HTTP sono un gruppo di funzioni che consentono di gestire le comunicazioni con API esterne e server come stream Observable. Utilizzandole, è possibile integrare le comunicazioni HTTP asincrone nelle catene di operatori RxJS e descrivere in modo dichiarativo la gestione degli errori, i processi di retry e altro ancora.

Caratteristiche principali

  • Comunicazioni HTTP dichiarative: gestendo le comunicazioni HTTP come Observable, è possibile elaborare in modo dichiarativo utilizzando gli operatori
  • Gestione unificata degli errori: unifica la gestione degli errori con operatori come catchError() e retry()
  • Cancellabile: è possibile annullare le richieste con unsubscribe()
  • Integrazione con altri stream: può essere combinato con altri Observable utilizzando switchMap() e simili

Elenco delle Creation Functions per la comunicazione HTTP

FunzioneDescrizioneTecnologia di baseUtilizzo principale
ajax()Comunicazione HTTP basata su XMLHttpRequestXMLHttpRequestSupporto browser legacy, monitoraggio dei progressi
fromFetch()Comunicazione HTTP basata su Fetch APIFetch APIBrowser moderni, comunicazione HTTP leggera

Confronto tra ajax() e fromFetch()

Differenze fondamentali

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

// ajax() - parsing automatico della risposta
const ajax$ = ajax.getJSON<Todo>('https://jsonplaceholder.typicode.com/todos/1');
ajax$.subscribe(data => console.log(data));

// fromFetch() - parsing manuale della risposta
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;
}

Tabella di confronto delle funzionalità

Funzionalitàajax()fromFetch()
Tecnologia di baseXMLHttpRequestFetch API
Parsing JSON automatico✅ Supportato con getJSON()❌ Chiamata manuale di .json()
Eventi di progresso✅ Supportato❌ Non supportato
Timeout✅ Supporto integrato❌ Implementazione manuale necessaria
Rilevamento automatico errori HTTP✅ Errore automatico per 4xx/5xx❌ Controllo manuale dello stato necessario
Cancellazione richiesta✅ Possibile con unsubscribe()✅ Possibile con unsubscribe()
Supporto IE11✅ Supportato❌ Necessario polyfill
Dimensione del bundleLeggermente grandePiccola

Linee guida per la scelta

Quando scegliere ajax()

  1. È necessario il supporto per browser legacy

    • Quando è necessario supportare browser vecchi come IE11
  2. È necessario il monitoraggio dei progressi

    • Quando si desidera visualizzare i progressi di upload/download dei file
  3. Recupero JSON semplice

    • Quando si desidera recuperare facilmente JSON con getJSON()
  4. È necessario il rilevamento automatico degli errori

    • Quando si desidera utilizzare il rilevamento automatico degli errori tramite codice di stato HTTP

Quando scegliere fromFetch()

  1. Supporto solo per browser moderni

    • Quando si supportano solo ambienti in cui è disponibile Fetch API
  2. Si desidera ridurre la dimensione del bundle

    • Quando una funzionalità di comunicazione HTTP leggera è sufficiente
  3. Si desidera utilizzare le funzionalità di Fetch API

    • Quando si desidera manipolare direttamente gli oggetti Request/Response
    • Quando si desidera utilizzare all'interno di Service Worker
  4. È necessario un controllo dettagliato

    • Quando si desidera personalizzare in dettaglio l'elaborazione della risposta

Esempi di utilizzo pratico

Pattern di chiamata API

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

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

// Pattern pratico utilizzando ajax()
const fetchUser$ = ajax.getJSON<User>('https://api.example.com/users/1').pipe(
  timeout(5000), // Timeout di 5 secondi
  retry(2), // Riprova 2 volte in caso di fallimento
  catchError(error => {
    console.error('Errore recupero utente:', error);
    return of(null); // Restituisce null in caso di errore
  })
);

fetchUser$.subscribe({
  next: user => {
    if (user) {
      console.log('Utente:', user);
    } else {
      console.log('Recupero utente fallito');
    }
  }
});

Pattern di invio form

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

// Trasforma l'evento submit del form in 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('Invio riuscito:', response),
  error: error => console.error('Errore invio:', error)
});

Domande frequenti

Q1: Quale dovrei usare tra ajax() e fromFetch()?

A: Se si supportano solo browser moderni, si consiglia fromFetch(). Le ragioni sono le seguenti:

  • Fetch API è lo standard web più recente
  • La dimensione del bundle è piccola
  • Alta compatibilità futura

Tuttavia, scegli ajax() nei seguenti casi:

  • È necessario il supporto IE11
  • È necessario il monitoraggio dei progressi
  • Il recupero JSON semplice è sufficiente

Q2: Come vengono gestiti gli errori HTTP (4xx, 5xx)?

A:

  • ajax(): quando il codice di stato HTTP è 400 o superiore, viene automaticamente trattato come errore e viene chiamato il callback error
  • fromFetch(): anche con errori HTTP viene chiamato il callback next. È necessario controllare manualmente response.ok

Q3: Come si annulla una richiesta?

A: Entrambi possono essere annullati con unsubscribe().

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

// Annulla dopo 3 secondi
setTimeout(() => subscription.unsubscribe(), 3000);

Prossimi passi

Per l'uso dettagliato di ciascuna funzione, fare riferimento alle seguenti pagine:

Risorse di riferimento

Pubblicato sotto licenza CC-BY-4.0.