Cada vegada que consultes el saldo del banc des del mòbil, pagues amb targeta en una botiga en línia o entres en un servei amb el teu compte de Google, hi ha una API treballant per sota. Les APIs són el teixit connectiu del programari modern: la manera estàndard com un programa demana alguna cosa a un altre programa sense necessitat de saber com està fet per dins. Aquesta primera lliçó defineix què és exactament una API, quin problema resol, quins tipus n'hi ha i per què se'n diu "contracte". També presenta la Botiga Aroma, la botiga de cafè d'especialitat que ens acompanyarà durant tot el curs, i tanca amb un primer exemple real de petició i resposta que anirem desgranant a les lliçons següents.
Contingut
- La idea central: interfícies que amaguen complexitat
- El problema que resol una API
- L'API com a contracte entre proveïdor i consumidor
- Exemples quotidians: passarel·les de pagament, mapes i login social
- Tipus d'API segons el seu àmbit
- Què és una API web i el model client-servidor
- Qui consumeix una API
- APIs públiques, de socis i internes
- L'escenari del curs: Botiga Aroma
- Primer exemple end-to-end:
GET /v1/cafes
- La idea central: interfícies que amaguen complexitat
API són les sigles d'Application Programming Interface, en català "interfície de programació d'aplicacions". Descomponguem el terme:
- Interfície: un punt de contacte definit entre dues parts. Un endoll és la interfície entre un electrodomèstic i la xarxa elèctrica.
- De programació: aquesta interfície no la fa servir una persona amb un ratolí, la fa servir un altre programa escrivint codi.
- D'aplicacions: les dues parts són peces de programari.
Una API és, doncs, el conjunt d'operacions que un programari ofereix a un altre programari, descrites de manera que es puguin invocar des de codi. L'essencial és allò que l'API no mostra: qui la fa servir no sap (ni li cal saber) en quin llenguatge està escrita, quina base de dades hi ha al darrere ni quants servidors l'atenen.
Pensa en la interfície d'un cotxe: volant, pedals i palanca. Això és l'"API" del cotxe. Pots conduir un cotxe de gasolina i un d'elèctric amb la mateixa interfície, encara que per dins siguin radicalment diferents. Si demà el fabricant canvia el motor, continues sabent conduir. Aquest desacoblament entre allò que s'ofereix i com està implementat és el cor de la idea.
- El problema que resol una API
Imagina que la Botiga Aroma vol mostrar el seu catàleg de cafès en tres llocs: el web d'escriptori, una aplicació mòbil i una pantalla tàctil de la botiga física. Sense API, cadascun d'aquests tres programes hauria de:
- Connectar-se directament a la base de dades.
- Conèixer els noms de les taules i les columnes.
- Repetir les regles de negoci (un cafè sense estoc es mostra o no?, com es calcula el preu amb IVA?).
Les conseqüències són previsibles: regles duplicades que es desincronitzen, credencials de base de dades escampades per tot arreu i la impossibilitat de canviar l'esquema sense trencar tres aplicacions alhora.
Amb una API, aquesta lògica viu en un sol lloc i els tres clients demanen el mateix: "dona'm els cafès disponibles". Els problemes concrets que resol són:
| Problema sense API | Com ho resol l'API |
|---|---|
| Lògica de negoci duplicada a cada client | Es centralitza al servidor, darrere de la interfície |
| Cada client necessita accés a la base de dades | Només el servidor hi accedeix; els clients parlen HTTP |
| Canviar la implementació els trenca a tots | La interfície es manté estable encara que canviï l'interior |
| Integrar un tercer implica donar-li accés intern | Se li dona una interfície acotada i amb permisos |
| Cada equip reinventa el format d'intercanvi | S'acorda un format comú (JSON, normalment) |
- L'API com a contracte entre proveïdor i consumidor
La metàfora més útil per entendre una API és la de contracte. Hi ha dues parts:
- El proveïdor (o productor): qui publica i manté l'API. En el nostre cas, l'equip de backend de la Botiga Aroma.
- El consumidor (o client): qui la invoca. L'app mòbil, el web, un soci extern.
El contracte especifica, com a mínim:
- Quines operacions existeixen i com s'invoquen (adreces, verbs, paràmetres).
- Quines dades cal enviar i amb quin format i restriccions.
- Què es retorna en cas d'èxit: estructura, tipus, unitats.
- Què passa quan alguna cosa falla: com se senyala un error i quina informació es dona.
- Quines garanties hi ha: disponibilitat, límits d'ús, política de canvis.
I com tot contracte, té una conseqüència incòmoda: un cop publicat, no el pots trencar unilateralment. Si la Botiga Aroma canvia avui el nom del camp preuEuros per preu, l'app mòbil de milers d'usuaris deixarà de mostrar preus aquesta mateixa tarda. Aquesta idea —que una API és una promesa a llarg termini— explica bona part de les decisions de disseny que veurem al mòdul 2, i és la raó de ser del versionat (lliçó 02-07).
Consell primerenc: dissenya pensant que el contracte durarà anys i que no controles qui el consumeix. És un canvi de mentalitat respecte a escriure codi intern que pots refactoritzar quan vulguis.
- Exemples quotidians: passarel·les de pagament, mapes i login social
Les APIs són més fàcils d'entendre amb casos que ja has fet servir com a usuari:
- Passarel·la de pagament: la Botiga Aroma no desa números de targeta ni parla amb els bancs. Envia a l'API de la passarel·la l'import i una referència de la comanda, i en rep una confirmació. La complexitat brutal del sistema de pagaments queda darrere d'una operació d'un parell de camps. A més, evita responsabilitats regulatòries enormes.
- Mapes: per mostrar on és la cafeteria física, el web demana a una API de mapes un mapa centrat en unes coordenades. Ningú de la Botiga Aroma no dibuixa carrers.
- Login social ("Entra amb Google"): la botiga no gestiona contrasenyes; delega l'autenticació en un proveïdor d'identitat i en rep la confirmació de qui és l'usuari. Veurem el mecanisme real (OAuth 2.0 i OpenID Connect) a la lliçó 04-03.
- Enviaments: quan una comanda es marca com a pagada, la Botiga Aroma crida l'API de la seva empresa de missatgeria, RàpidEnviaments, per generar l'etiqueta i obtenir un número de seguiment.
El patró es repeteix: no construeixis allò que pots consumir; no exposis per dins allò que pots oferir per fora.
- Tipus d'API segons el seu àmbit
No totes les APIs viatgen per la xarxa. Convé distingir tres àmbits, perquè el terme es fa servir per als tres:
| Àmbit | Què és | Com s'invoca | Exemple |
|---|---|---|---|
| De biblioteca o llenguatge | Funcions i classes públiques d'una llibreria | Crida de funció al mateix procés | Array.prototype.map() en JavaScript, fetch() |
| De sistema operatiu | Serveis que el SO ofereix als programes | Crides al sistema | Obrir un fitxer, demanar la càmera a Android |
| Web (o remota) | Serveis d'un altre programa a través de la xarxa | Petició HTTP a una adreça | GET https://api.botigaaroma.example/v1/cafes |
Un exemple d'API de biblioteca que ja coneixes:
// L'API pública d'un array de JavaScript inclou map(), filter(), etc.
// Saps QUÈ fa filter() i què retorna, però no com està implementat
// internament al motor V8. Això és exactament una API.
const cafes = [
{ nom: 'Etiòpia Yirgacheffe', estoc: 120 },
{ nom: 'Colòmbia Huila', estoc: 0 }
];
const disponibles = cafes.filter((cafe) => cafe.estoc > 0);
console.log(disponibles.length); // 1Les tres comparteixen filosofia, però les APIs web tenen una diferència crucial: la crida travessa la xarxa. Això introdueix latència, fallades de connexió, seguretat, control d'accés i versions que conviuen. Aquest curs tracta exclusivament d'APIs web i, dins d'aquestes, de l'estil REST.
- Què és una API web i el model client-servidor
Una API web és una API a la qual s'accedeix mitjançant el protocol HTTP a través d'una adreça de xarxa. Funciona sota el model client-servidor:
- El client pren la iniciativa: envia una petició.
- El servidor escolta, processa i retorna una resposta.
- La conversa sempre la comença el client (els webhooks, a 01-07, inverteixen aquesta direcció).
sequenceDiagram
participant C as Client<br/>(app mòbil)
participant A as API de la Botiga Aroma
participant BD as Base de dades
C->>A: GET /v1/cafes (petició HTTP)
A->>BD: Consulta cafès disponibles
BD-->>A: Files de la taula
A-->>C: 200 OK + JSON (resposta HTTP)
Fixa't en dos detalls importants del diagrama:
- El client mai no parla amb la base de dades. Només coneix l'adreça de l'API.
- Allò que retorna l'API no són "files d'una taula", sinó una representació en JSON pensada per ser consumida. Aquesta distinció entre la dada interna i la seva representació és central en REST i la desenvoluparem a la lliçó 01-04.
- Qui consumeix una API
Saber qui hi ha a l'altre costat canvia el disseny. Els consumidors típics de l'API de la Botiga Aroma:
- Aplicació web d'una sola pàgina (SPA): la botiga en línia. S'executa al navegador i demana dades per JavaScript. És sensible al nombre de peticions i a les polítiques de seguretat del navegador (CORS, lliçó 04-05).
- Aplicació mòbil nativa: Aroma Mòbil, per a iOS i Android. Peculiaritat crítica: l'usuari decideix quan actualitza, així que versions antigues continuaran cridant la teva API durant mesos.
- Un altre servei del backend: el servei de facturació pregunta a l'API per les comandes del mes. És trànsit intern, amb requisits de rendiment diferents.
- Integracions de tercers: RàpidEnviaments consulta les comandes pendents de recollida; una eina de comptabilitat exporta les vendes.
- Eines i scripts:
curl, Postman (lliçó 05-01), scripts de manteniment del mateix equip.
- APIs públiques, de socis i internes
Segons a qui s'obri la porta, es distingeixen tres categories. És una decisió de negoci amb implicacions tècniques enormes:
| Tipus | Qui hi accedeix | Control sobre el consumidor | Implicacions |
|---|---|---|---|
| Pública (oberta) | Qualsevol que s'hi registri | Cap | Documentació impecable, versionat estricte, límits d'ús, no pots trencar res |
| De socis (partner) | Empreses amb acord previ | Contractual | Credencials per soci, condicions i ritme de canvi negociats |
| Interna (privada) | Equips de la mateixa empresa | Total | Pot evolucionar de pressa, però necessita seguretat igualment |
Un error freqüent és tractar l'API interna com si no necessités disciplina. Quan l'empresa creix, l'API interna acaba tenint deu consumidors que no controles en el dia a dia, i la manca de contracte es paga cara.
- L'escenari del curs: Botiga Aroma
A partir d'aquí, tot el que aprenguem s'aplicarà sobre un cas únic, perquè els conceptes no quedin en abstracte.
La Botiga Aroma és una botiga en línia de cafè d'especialitat. Ven cafès d'origen, torrefaccions pròpies i subscripcions mensuals. La seva realitat tècnica és:
- Una botiga web feta com a SPA.
- Una app mòbil, Aroma Mòbil, amb la qual els clients repeteixen comandes.
- Un panell intern d'administració que fa servir l'equip de magatzem i d'atenció al client.
- Una integració amb RàpidEnviaments, l'empresa de missatgeria que reparteix les comandes.
Els seus recursos (les "coses" que gestiona el negoci) són cinc, i seran els mateixos durant tot el curs:
| Recurs | Què representa | Adreça base |
|---|---|---|
| Cafès / productes | El catàleg que es ven | /v1/cafes |
| Clients | Qui compra | /v1/clients |
| Comandes | Una compra confirmada | /v1/comandes |
| Ressenyes | Valoracions de clients sobre un cafè | /v1/ressenyes |
| Cistelles | Compra en curs, encara sense confirmar | /v1/cistelles |
L'API viu a https://api.botigaaroma.example/v1 i en realitat són dues APIs amb el mateix domini de negoci: una de pública (catàleg i ressenyes, perquè blogs i comparadors puguin mostrar-ne els cafès) i una d'interna (comandes, estoc, clients) que fan servir el panell d'administració i RàpidEnviaments com a soci.
A partir del mòdul 3 la implementarem amb Node.js 20 i Express, escrivint els identificadors en català (obtenirCafes, crearComanda, preuEuros) perquè el codi sigui fàcil de llegir.
- Primer exemple end-to-end:
GET /v1/cafes
GET /v1/cafesVegem l'API més simple possible en acció: demanar el catàleg. Farem servir curl, una eina de línia d'ordres que envia peticions HTTP i mostra la resposta. Està disponible a Linux, macOS i Windows 10 o superior.
Aquesta línia conté tres coses: el programa (curl), i una adreça que alhora indica on és l'API (api.botigaaroma.example), que hi parlem per canal xifrat (https) i què demanem (/v1/cafes, la llista de cafès de la versió 1 de l'API). Com que no hi indiquem res més, curl fa servir el mètode GET, que vol dir "dona'm això sense modificar res".
La resposta que retorna el servidor:
{
"dades": [
{
"id": "caf_001",
"nom": "Etiòpia Yirgacheffe",
"origen": "Etiòpia",
"torrefaccio": "clar",
"preuEuros": 14.50,
"estoc": 120
},
{
"id": "caf_002",
"nom": "Colòmbia Huila",
"origen": "Colòmbia",
"torrefaccio": "mitja",
"preuEuros": 12.90,
"estoc": 80
}
],
"total": 2
}Analitzem la resposta peça a peça, sense entrar encara en el detall del protocol:
- És en JSON (JavaScript Object Notation), el format d'intercanvi dominant avui. Les
{}delimiten objectes amb parellsclau: valor, i els[]delimiten llistes. - La clau
dadesconté la llista de cafès. Embolcallar la llista dins d'un objecte (en comptes de retornar l'array directament) deixa espai per afegir metadades com aratotalsense trencar el contracte. - Cada cafè té un
idestable (caf_001). Aquest identificador és el que permet demanar després un cafè concret:GET /v1/cafes/caf_001. preuEurosdeixa explícita la unitat al nom del camp. Un camp anomenat noméspreuobliga a llegir la documentació per saber si són euros o cèntims: una font clàssica d'errors.torrefacciofa servir un valor d'un conjunt tancat i conegut (clar,mitja,fosc).
Si en comptes de la llista volem un cafè concret, canviem l'adreça:
{
"id": "caf_001",
"nom": "Etiòpia Yirgacheffe",
"origen": "Etiòpia",
"torrefaccio": "clar",
"preuEuros": 14.50,
"estoc": 120,
"notesTast": ["gessamí", "bergamota", "préssec"]
}Fixa't en un detall gens casual: l'adreça del recurs individual és la de la col·lecció més el seu identificador. Aquesta regularitat, que ara sembla anecdòtica, és un dels senyals d'identitat de REST i la formalitzarem a la lliçó 01-04.
Tot el que passa per sota (capçaleres, codis d'estat, mètodes) ho veurem a la lliçó 01-03, dedicada a HTTP. De moment queda't amb la imatge completa: un client demana alguna cosa a una adreça i un servidor respon amb una representació en JSON.
Errors Comuns i Consells
- Confondre l'API amb la base de dades. L'API no és una finestra a les taules: és una interfície de negoci. Exposar l'esquema intern tal qual et lliga per sempre a aquest esquema.
- Confondre l'API amb l'aplicació web. El web és un consumidor. Si dissenyes l'API pensant només en la pantalla que estàs construint avui, l'app mòbil que arribi demà no hi encaixarà.
- Creure que "API" sempre vol dir "API web". En una oferta de feina o en una conversa, convé precisar de quin àmbit es parla (biblioteca, sistema operatiu o xarxa).
- Oblidar que el contracte és una promesa. Abans de publicar un nom de camp, pensa si el voldràs mantenir d'aquí a dos anys.
- No anomenar les unitats.
preuEuros,pesGramsoduracioSegonsestalvien incidències reals en producció. - Consell: quan comencis a dissenyar, escriu primer un exemple de petició i de resposta JSON, com el d'aquesta lliçó, abans d'escriure ni una sola línia de servidor. És l'essència de l'enfocament API-first que veurem a 01-02 i 05-02.
Exercicis
Exercici 1: identificar el contracte
La Botiga Aroma vol que un blog de cafès extern mostri al seu web els tres cafès més venuts. Enumera com a mínim cinc elements que hauria d'especificar el contracte d'aquesta API perquè el blog s'hi pugui integrar sense preguntar res per correu electrònic.
Exercici 2: classificar consumidors i tipus d'API
Per a cada situació, indica qui és el consumidor i si l'API implicada hauria de ser pública, de socis o interna, justificant-ho breument:
- El panell d'administració marca una comanda com a enviada.
- Un comparador de preus mostra el catàleg de la Botiga Aroma.
- RàpidEnviaments consulta cada 10 minuts les comandes pendents de recollir.
- Aroma Mòbil mostra l'historial de comandes de l'usuari que ha iniciat sessió.
Exercici 3: dissenyar una primera resposta
Dissenya el JSON que retornaria GET /v1/cafes/caf_002/ressenyes (les ressenyes d'un cafè). Ha d'incloure com a mínim dues ressenyes, amb identificador, autor, puntuació d'1 a 5, comentari i data. Aplica-hi el que has après sobre noms de camp, unitats i embolcall de la llista.
Solucions
Solució 1
Un contracte mínim utilitzable hauria d'especificar:
- L'adreça exacta de l'operació, per exemple
GET https://api.botigaaroma.example/v1/cafes?ordenar=mesVenuts&limit=3. - Com s'autentica el blog: si necessita clau d'API i com s'envia.
- L'estructura de la resposta: quins camps arriben, de quin tipus i quins poden faltar (
nomtext,preuEurosnombre decimal,estocenter). - El comportament davant d'errors: què es retorna si la clau no és vàlida o el servei no està disponible, i com distingir-ho d'una resposta correcta buida.
- Els límits d'ús: quantes peticions per minut s'admeten i què passa quan se superen.
Elements addicionals igualment vàlids: política de versionat i avís de canvis, condicions d'ús de les dades i de les imatges, i contacte de suport.
Solució 2
- Panell d'administració → API interna. Modifica l'estat del negoci i només la fa servir personal de l'empresa.
- Comparador de preus → API pública. Només llegeix catàleg, informació no sensible; comercialment interessa que es difongui.
- RàpidEnviaments → API de socis. És una empresa externa concreta amb acord previ, amb credencials pròpies i accés limitat a les comandes que li pertoquen.
- Aroma Mòbil → API interna (encara que sigui accessible des d'internet). És un client propi que accedeix a dades personals; requereix autenticació de l'usuari i retornar-li únicament les seves comandes.
Fixa't en el matís del cas 4: "interna" es refereix a qui la controla i per a qui es dissenya, no a si s'hi pot arribar des de la xarxa.
Solució 3
{
"dades": [
{
"id": "res_101",
"cafeId": "caf_002",
"autor": "Marta G.",
"puntuacio": 5,
"comentari": "Equilibrat i dolç, perfecte per a filtre al matí.",
"data": "2026-07-14"
},
{
"id": "res_102",
"cafeId": "caf_002",
"autor": "Lluís P.",
"puntuacio": 4,
"comentari": "Molt correcte, tot i que esperava més acidesa.",
"data": "2026-07-28"
}
],
"total": 2
}Decisions a destacar: la llista va embolcallada dins de dades per poder afegir-hi metadades; cada ressenya porta cafeId perquè sigui autoexplicativa encara que es copiï fora de context; puntuacio és un nombre enter i no un text; i la data fa servir el format ISO AAAA-MM-DD, que és inequívoc internacionalment (davant de 14/07/2026, que un consumidor nord-americà podria llegir malament).
Conclusió
Una API és una interfície que permet a un programa fer servir els serveis d'un altre sense conèixer-ne l'interior, i el seu valor rau tant en allò que exposa com en allò que amaga. Hem vist que funciona com un contracte entre proveïdor i consumidor, que hi ha APIs de biblioteca, de sistema operatiu i web, i que aquestes últimes segueixen el model client-servidor sobre HTTP. També hem classificat les APIs en públiques, de socis i internes, i hem conegut la Botiga Aroma, els cinc recursos de la qual —cafès, clients, comandes, ressenyes i cistelles— ens serviran de laboratori fins al final del curs. El primer GET /v1/cafes ja ens ha mostrat el patró fonamental: petició a una adreça, resposta en JSON.
Abans d'entrar en com es dissenyen aquestes interfícies, convé entendre d'on vénen. A la lliçó següent, Història i evolució de les APIs, recorrerem el camí que va de les crides a procediment remot fins a l'economia de les APIs actual, per comprendre per què REST es va imposar i quines lliçons pràctiques deixa aquesta història a qui dissenya una API avui.
Curs de REST API: Principis de Disseny i Desenvolupament d'APIs RESTful
Mòdul 1: Introducció a les APIs RESTful
- Què és una API?
- Història i evolució de les APIs
- Fonaments d'HTTP per a APIs
- Principis bàsics de REST
- Model de maduresa de Richardson i HATEOAS
- REST vs. SOAP
- REST davant de GraphQL, gRPC i webhooks
Mòdul 2: Disseny d'APIs RESTful
- Principis de disseny d'APIs RESTful
- Recursos i URIs
- Mètodes HTTP
- Codis d'estat HTTP
- Representacions, capçaleres i negociació de contingut
- Filtratge, ordenació, paginació i cerca
- Versionat d'APIs
- Documentació d'APIs
Mòdul 3: Desenvolupament d'APIs RESTful
- Configuració de l'entorn de desenvolupament
- Creació d'un servidor bàsic
- Gestió de peticions i respostes
- Validació de dades d'entrada
- Persistència i capa d'accés a dades
- Autenticació i autorització
- Gestió d'errors
- Proves i validació
Mòdul 4: Bones Pràctiques i Seguretat
- Bones pràctiques en el disseny d'APIs
- Seguretat en APIs RESTful
- OAuth 2.0 i OpenID Connect a la pràctica
- Rate limiting i throttling
- CORS i polítiques de seguretat
- Memòria cau HTTP i rendiment
- Observabilitat: logs, mètriques i traces
Mòdul 5: Eines i Frameworks
- Postman per a proves d'APIs
- Swagger i OpenAPI per a documentació
- Frameworks populars per a APIs RESTful
- Contractes, mocks i proves automatitzades d'API
- Integració contínua i desplegament
- API gateways i portals de desenvolupador
