Passa al contenuto principale

Step 4: Contratti

I contratti definiscono come i moduli comunicano tra loro e con il mondo esterno. Un contratto è un accordo: una volta pubblicato, cambiarlo ha un costo. Progettarlo bene fin dall'inizio riduce breaking changes futuri.

Cosa definire per ogni interfaccia

Per ogni endpoint, evento o integrazione:

CampoDettaglio
Schema requestcampi, tipi, vincoli, valori ammessi
Schema responsestruttura, campi opzionali, valori di default
Erroricodici, messaggi, struttura dell'errore
Validazionicosa viene validato e dove
Autenticazioneschema richiesto (API key, JWT, cookie…)
Autorizzazioneruoli o policy necessari
Versionamentocome si gestisce l'evoluzione del contratto
Idempotenzaobbligatoria per operazioni critiche: stessa request, stesso risultato

Idempotenza

Le operazioni critiche (pagamenti, invio di ordini, operazioni che producono effetti collaterali) devono essere idempotenti. Il chiamante deve poter ripetere la stessa richiesta in caso di timeout o errore di rete senza produrre effetti duplicati.

La prima forma di protezione sono gli indici univoci sul dominio: se l'operazione produce un'entità con una chiave naturale univoca, il database stesso impedisce la duplicazione senza bisogno di logica applicativa aggiuntiva.

Quando la chiave naturale non è sufficiente, l'idempotenza si garantisce tramite una chiave idempotency fornita dal chiamante:

POST /ordini
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000

Il sistema memorizza la chiave e, se riceve la stessa richiesta una seconda volta, restituisce la risposta originale senza rieseguire l'operazione.

Versionamento dei contratti

I contratti si versionano esplicitamente. Un cambio che rompe la compatibilità non si fa in silenzio: si introduce una nuova versione e si mantiene la vecchia per un periodo di transizione concordato con i team dipendenti.

Strategie comuni:

  • versione nell'URL: /api/v2/ordini
  • versione nell'header: API-Version: 2

La scelta dipende dal contesto, ma la coerenza all'interno dello stesso sistema è più importante della strategia scelta.

Contratti interni vs esterni

I contratti tra moduli interni allo stesso sistema hanno più flessibilità: possono evolvere con il sistema. I contratti esposti a sistemi esterni o a team separati sono impegni formali: vanno trattati con la stessa cura di un'API pubblica.

Criterio di completamento

I contratti sono consumabili da un team esterno senza necessità di interpretazioni o chiarimenti informali.


Prossimo step: Step 5: Flussi Critici