REST no és HTTP, però pràcticament totes les APIs REST del món viatgen sobre HTTP. Si no entens el protocol, acabaràs copiant exemples sense saber per què funcionen i depurant a cegues quan deixin de fer-ho. Aquesta lliçó obre HTTP en canal: veurem en cru com és una petició i una resposta, què implica que el protocol sigui sense estat, com es descompon una URL, quines capçaleres apareixen a gairebé totes les APIs, per què tot ha d'anar xifrat i què canvia entre HTTP/1.1, HTTP/2 i HTTP/3. Acabarem observant trànsit real contra l'API de la Botiga Aroma amb curl -v i amb les eines del navegador.
Aquesta és una lliçó de mapa i fonaments: presentarem els mètodes i els codis d'estat com a panoràmica, però el seu estudi detallat correspon a les lliçons 02-03 i 02-04.
Contingut
- Què és HTTP i quin paper té en una API
- Anatomia d'una petició HTTP
- Anatomia d'una resposta HTTP
- El model petició-resposta i l'absència d'estat
- La URL i les seves parts
- Capçaleres habituals en APIs
- Panoràmica de mètodes i codis d'estat
- HTTPS i TLS: per què tota API va xifrada
- HTTP/1.1, HTTP/2 i HTTP/3
- Observar HTTP:
curl -vi les DevTools
- Què és HTTP i quin paper té en una API
HTTP (HyperText Transfer Protocol) és un protocol de la capa d'aplicació que defineix com un client demana alguna cosa a un servidor i com aquest respon. El defineixen tres característiques:
- És textual en les seves versions clàssiques: es pot llegir amb els ulls, cosa que facilita enormement depurar.
- Segueix un model petició-resposta: per cada petició hi ha exactament una resposta.
- És sense estat: el servidor no recorda res de peticions anteriors.
Quan a la lliçó 01-01 vam escriure curl https://api.botigaaroma.example/v1/cafes, curl va construir un missatge HTTP, el va enviar per una connexió de xarxa i ens va mostrar només el cos de la resposta. Ara veurem aquest missatge complet.
sequenceDiagram
participant C as Client
participant S as Servidor de la Botiga Aroma
Note over C,S: 1. S'estableix la connexió (TCP + TLS)
C->>S: Petició: línia de petició + capçaleres + cos
Note over S: 2. El servidor processa
S-->>C: Resposta: línia d'estat + capçaleres + cos
Note over C,S: 3. La connexió es reutilitza o es tanca
- Anatomia d'una petició HTTP
Tota petició HTTP té tres parts: línia de petició, capçaleres i, opcionalment, cos. Així és una petició completa per crear una comanda a la Botiga Aroma:
POST /v1/comandes HTTP/1.1
Host: api.botigaaroma.example
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
User-Agent: AromaMobil/2.4 (Android 14)
Content-Length: 118
{
"clientId": "cli_842",
"linies": [
{ "cafeId": "caf_001", "quantitat": 2 }
]
}Analitzem cada element:
Línia de petició (POST /v1/comandes HTTP/1.1). Té exactament tres peces separades per espais:
| Peça | Valor | Significat |
|---|---|---|
| Mètode | POST |
L'acció que es vol dur a terme (aquí, crear alguna cosa) |
| Ruta | /v1/comandes |
Quin recurs és el destinatari, sense el domini |
| Versió | HTTP/1.1 |
Quina versió del protocol parla el client |
Capçaleres: parells Nom: valor, un per línia. Són metadades sobre la petició: descriuen el missatge, no formen part de la dada enviada. Host és obligatòria en HTTP/1.1 perquè un mateix servidor pot allotjar molts dominis i necessita saber a quin va dirigida.
Línia en blanc: separa les capçaleres del cos. És obligatòria, i és la marca que li diu al servidor "les capçaleres s'han acabat".
Cos (body): les dades que s'envien. Aquí, la comanda en JSON. Les peticions GET normalment no porten cos; les de creació o modificació sí.
Punt clau: la ruta va sense domini a la línia de petició. El domini viatja a la capçalera
Host. En escriurehttps://api.botigaaroma.example/v1/comandes, el client descompon aquesta adreça en les dues parts automàticament.
- Anatomia d'una resposta HTTP
La resposta té la mateixa estructura, canviant-ne la primera línia:
HTTP/1.1 201 Created
Date: Fri, 14 Aug 2026 09:12:44 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 226
Location: /v1/comandes/com_5001
Cache-Control: no-store
{
"id": "com_5001",
"clientId": "cli_842",
"estat": "pendent_pagament",
"totalEuros": 29.00,
"linies": [
{ "cafeId": "caf_001", "nom": "Etiòpia Yirgacheffe", "quantitat": 2, "preuEuros": 14.50 }
]
}Línia d'estat (HTTP/1.1 201 Created):
| Peça | Valor | Significat |
|---|---|---|
| Versió | HTTP/1.1 |
Versió que parla el servidor |
| Codi | 201 |
Resultat en forma de nombre, interpretable per màquines |
| Frase | Created |
Descripció llegible; purament informativa |
Capçaleres de resposta: aquí Content-Type indica que el cos és JSON codificat en UTF-8, Content-Length diu quants bytes ocupa, Location assenyala on ha quedat el recurs acabat de crear (una convenció molt útil que reprendrem a 02-04) i Cache-Control: no-store prohibeix desar aquesta resposta a la memòria cau, cosa raonable en una comanda.
Cos: la representació del recurs creat. Fixa't que el servidor hi ha afegit informació que el client no va enviar: l'id, l'estat inicial i el totalEuros calculat. El client no calcula preus; això és lògica de negoci del servidor.
- El model petició-resposta i l'absència d'estat
HTTP funciona per torns estrictes: el client pregunta, el servidor respon. El servidor mai no inicia la conversa (per a això hi ha els webhooks, els Server-Sent Events i els WebSockets, que veurem a 01-07).
La propietat més important per a nosaltres és que HTTP no té estat (stateless): cada petició és independent i el servidor no recorda res de les anteriors. Si envies aquestes dues peticions seguides:
curl https://api.botigaaroma.example/v1/cafes/caf_001
curl https://api.botigaaroma.example/v1/cafes/caf_002el servidor no sap que la segona ve del mateix client que la primera, tret que l'hi diguis explícitament a la petició mateixa.
Conseqüència pràctica número u: cada petició ha de portar tota la informació necessària per ser atesa, inclosa la identitat de qui la fa. Per això la capçalera Authorization es repeteix en totes i cadascuna de les peticions autenticades, i no "s'inicia sessió una vegada".
Conseqüència pràctica número dos: com que cap petició no depèn d'una d'anterior, qualsevol servidor d'un grup pot atendre qualsevol petició. Això és el que permet posar deu servidors darrere d'un balancejador i escalar horitzontalment.
Compte amb una confusió freqüent: que el protocol no tingui estat no vol dir que no hi hagi dades persistents. La cistella de la Botiga Aroma es desa a la base de dades i és un recurs més (/v1/cistelles/cis_77); el que no existeix és una "sessió" viva a la memòria d'un servidor concret. La diferència entre estat d'aplicació i estat de sessió és central en REST i la reprenem a 01-04.
- La URL i les seves parts
Una URL identifica de manera única un recurs a la xarxa. Analitzem-ne una de completa de la Botiga Aroma:
https://api.botigaaroma.example:443/v1/cafes?origen=Etiopia&torrefaccio=clar#notes \___/ \_____________________/ \_/\_______/\______________________________/\____/ 1 2 3 4 5 6
| # | Part | Exemple | Per a què serveix |
|---|---|---|---|
| 1 | Esquema | https |
Protocol que cal fer servir. En APIs, sempre https |
| 2 | Host | api.botigaaroma.example |
Servidor al qual connectar-se |
| 3 | Port | 443 |
Port TCP. S'omet si és l'estàndard (80 per a http, 443 per a https) |
| 4 | Ruta | /v1/cafes |
Quin recurs es demana dins d'aquest servidor |
| 5 | Query string | ?origen=Etiopia&torrefaccio=clar |
Paràmetres: filtres, ordre, paginació |
| 6 | Fragment | #notes |
No s'envia al servidor; només el fa servir el navegador |
Detalls que convé interioritzar:
- La query string comença amb
?i encadena parellsclau=valorseparats per&. És el lloc natural per al que modula la consulta (filtrar, ordenar, paginar), no per identificar el recurs. Ho desenvoluparem a 02-06. - El fragment no arriba mai al servidor. No el facis servir mai per transportar dades d'una API.
- Els valors han d'anar codificats (percent-encoding) si contenen caràcters especials: un espai és
%20, unaçes codifica en diversos bytes. Per això a l'exemple escrivimorigen=Etiopiasense accent, o béorigen=Eti%C3%B2pia.
Amb curl, convé posar la URL entre cometes perquè l'intèrpret d'ordres no interpreti l'& com a "executa en segon pla":
# Correcte: la URL completa entre cometes
curl "https://api.botigaaroma.example/v1/cafes?origen=Etiopia&torrefaccio=clar"
# Incorrecte: l'intèrpret parteix l'ordre a l'& i curl només rep fins a "Etiopia"
curl https://api.botigaaroma.example/v1/cafes?origen=Etiopia&torrefaccio=clarTambé hi veuràs el terme URI. A la pràctica de les APIs web, URI i URL es fan servir com a sinònims; formalment, URI és el concepte general d'identificador i URL és un identificador que a més indica com localitzar el recurs.
- Capçaleres habituals en APIs
Hi ha desenes de capçaleres estàndard. Aquestes són les que apareixeran una vegada i una altra al curs:
| Capçalera | Direcció | Per a què serveix | Exemple |
|---|---|---|---|
Content-Type |
Totes dues | Format del cos d'aquest missatge | application/json; charset=utf-8 |
Accept |
Petició | Formats que el client sap rebre | application/json |
Authorization |
Petició | Credencials de qui fa la crida | Bearer eyJhbGci... |
User-Agent |
Petició | Qui és el client (nom i versió) | AromaMobil/2.4 (Android 14) |
Content-Length |
Totes dues | Mida del cos en bytes | 226 |
Cache-Control |
Totes dues | Política de memòria cau | max-age=300, public |
Location |
Resposta | Adreça d'un recurs creat o de redirecció | /v1/comandes/com_5001 |
Date |
Resposta | Moment en què es va generar la resposta | Fri, 14 Aug 2026 09:12:44 GMT |
Tres precisions importants:
Content-TypeiAcceptno són el mateix.Content-Typedescriu allò que envio;Acceptdescriu allò que vull rebre. Una peticióPOSTsol portar les dues: "t'envio JSON i en vull JSON de tornada". UnaGETnomés portaAccept, perquè no envia cos. Aquest mecanisme s'anomena negociació de contingut i és matèria de 02-05.Authorizationamb esquemaBearerés el patró dominant avui: s'envia un token que el servidor valida. Tota la mecànica (JWT, OAuth 2.0) es veu a 03-06 i 04-03.- Les capçaleres no distingeixen majúscules de minúscules al nom (
content-typeés igual queContent-Type), encara que per convenció s'escriuen amb inicial majúscula. En HTTP/2 i HTTP/3 viatgen sempre en minúscules.
També hi ha capçaleres personalitzades. La convenció moderna és no fer servir el prefix X- (desaconsellat des de l'RFC 6648) i triar noms específics com ara Aroma-Peticio-Id.
- Panoràmica de mètodes i codis d'estat
Aquí només dibuixem el mapa. L'estudi detallat de cada mètode és a la lliçó 02-03 i el de cada codi d'estat a la 02-04.
Mètodes: el verb de la petició
El mètode indica la intenció de la petició sobre el recurs:
| Mètode | Intenció | Exemple a la Botiga Aroma |
|---|---|---|
GET |
Obtenir una representació | GET /v1/cafes/caf_001 |
POST |
Crear o processar alguna cosa nova | POST /v1/comandes |
PUT |
Reemplaçar del tot | PUT /v1/cafes/caf_001 |
PATCH |
Modificar parcialment | PATCH /v1/cafes/caf_001 |
DELETE |
Eliminar | DELETE /v1/cistelles/cis_77 |
HEAD |
Com GET però només capçaleres |
Comprovar si alguna cosa existeix o ha canviat |
OPTIONS |
Consultar què es permet | El fa servir el navegador en CORS (04-05) |
Dues propietats que ja convé tenir al radar, perquè expliquen per què l'elecció del mètode importa:
- Segur (safe): no modifica res al servidor.
GETiHEADho són. Per això un cercador pot rastrejar enllaços sense por. - Idempotent: repetir la mateixa petició diverses vegades deixa el sistema igual que fer-ho una sola vegada.
GET,PUTiDELETEho són;POSTno. D'aquí que reintentar unPOST /v1/comandesdesprés d'una fallada de xarxa pugui generar dues comandes, un problema real que abordarem.
Codis d'estat: el resultat en tres xifres
El primer dígit determina la família, i amb això ja en saps l'essencial:
| Família | Significat | Exemples freqüents |
|---|---|---|
| 1xx | Informatiu (rar en APIs) | 100 Continue |
| 2xx | Èxit | 200 OK, 201 Created, 204 No Content |
| 3xx | Redirecció o "fes servir la teva memòria cau" | 301 Moved Permanently, 304 Not Modified |
| 4xx | Error del client: la petició està malament | 400 Bad Request, 401 Unauthorized, 404 Not Found, 422 Unprocessable Content |
| 5xx | Error del servidor: la petició era vàlida | 500 Internal Server Error, 503 Service Unavailable |
La distinció entre 4xx i 5xx és de les més útils que hi ha a l'hora de depurar: 4xx vol dir "arregla la petició", 5xx vol dir "el problema és meu". Un servidor que retorna 200 OK amb un cos {"error": "no trobat"} està mentint al protocol i trencant tot l'instrumental automàtic que s'assenta en el codi: memòries cau, reintents, monitoratge i alertes.
- HTTPS i TLS: per què tota API va xifrada
HTTPS és HTTP transportat dins d'una connexió xifrada amb TLS (Transport Layer Security, el successor de SSL). Aporta tres garanties:
- Confidencialitat: ningú del camí no pot llegir-ne el contingut. Sense TLS, la capçalera
Authorizationamb el token viatja en text pla i qualsevol de la mateixa xarxa wifi la pot copiar. - Integritat: ningú no pot alterar els missatges sense que es detecti.
- Autenticitat: el certificat del servidor demostra que parles amb
api.botigaaroma.examplei no amb un impostor.
A la pràctica això vol dir:
- Mai no publiquis una API per
http://. Ni tan sols "només per a proves": les URL de proves acaben en producció. - Redirigeix el trànsit
httpahttpsamb301, però no hi confiïs com a seguretat: la primera petició ja ha viatjat en clar. - Els tokens i les claus d'API només són segurs si el canal ho és.
- L'API interna també va xifrada. La xarxa interna no és un lloc de confiança; el model de confiança zero assumeix que un atacant ja és a dins.
Verificar el certificat d'una API amb curl:
Ampliarem tot això a la lliçó 04-02, dedicada a la seguretat.
- HTTP/1.1, HTTP/2 i HTTP/3
El model conceptual (petició, resposta, mètodes, capçaleres, codis) és idèntic en les tres versions. El que canvia és com es transporten els missatges:
| Aspecte | HTTP/1.1 (1997) | HTTP/2 (2015) | HTTP/3 (2022) |
|---|---|---|---|
| Format | Text | Binari | Binari |
| Transport | TCP | TCP | QUIC sobre UDP |
| Peticions simultànies | Una per connexió (a la pràctica, diverses connexions) | Multiplexades en una connexió | Multiplexades, sense bloqueig per pèrdua |
| Capçaleres | Text repetit a cada petició | Comprimides (HPACK) | Comprimides (QPACK) |
| Problema principal que resol | — | Bloqueig de capçalera de línia a HTTP | Bloqueig de capçalera de línia a TCP |
Què canvia a la pràctica per a qui dissenya una API:
- No et canvia el codi. Una API REST funciona igual en les tres versions; normalment és el servidor web o el gateway qui decideix la versió, i el client negocia la millor disponible.
- Sí que canvia el cost de fer moltes peticions. Amb HTTP/1.1, fer 30 crides per pintar una pantalla era caríssim, i això va empènyer a dissenyar respostes grans que ho retornen tot. Amb HTTP/2 diverses peticions petites són molt més assumibles. És un argument que apareixerà quan discutim GraphQL a 01-07.
- Capçaleres barates: amb compressió, repetir
Authorizationa cada petició pesa poc. - HTTP/2 i HTTP/3 exigeixen TLS a la pràctica (tots els navegadors ho requereixen), cosa que reforça el punt anterior.
- gRPC s'assenta en HTTP/2 precisament pel multiplexatge i l'streaming bidireccional.
- Observar HTTP:
curl -v i les DevTools
curl -v i les DevToolsNo es pot aprendre HTTP sense veure'l. Amb dues eines n'hi ha prou per al 95 % dels casos.
curl -v
L'opció -v (verbose) mostra la conversa completa. Les línies que comencen per > són el que envia el client; les que comencen per <, el que retorna el servidor; les que comencen per * són informació de la connexió.
Sortida (abreujada i comentada):
* Connected to api.botigaaroma.example (203.0.113.42) port 443
* SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
> GET /v1/cafes/caf_001 HTTP/2
> Host: api.botigaaroma.example
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/2 200
< content-type: application/json; charset=utf-8
< cache-control: public, max-age=300
< etag: "a7f3c9"
<
{"id":"caf_001","nom":"Etiòpia Yirgacheffe","preuEuros":14.50,"estoc":120}Què ens ensenya aquesta sortida:
curlhi va afegir automàticamentHost,User-AgentiAccept: */*("accepto qualsevol format").- La connexió va negociar HTTP/2 i TLS 1.3, i les capçaleres de resposta arriben en minúscules, com correspon a HTTP/2.
- El servidor permet posar-ho a la memòria cau 5 minuts (
max-age=300) i envia unETag, una empremta del contingut que permet revalidar sense tornar-lo a descarregar (lliçó 04-06).
Opcions de curl que farem servir durant tot el curs:
# -i mostra les capçaleres de resposta juntament amb el cos (més net que -v)
curl -i https://api.botigaaroma.example/v1/cafes/caf_001
# -X força el mètode, -H afegeix capçaleres, -d envia cos
curl -X POST https://api.botigaaroma.example/v1/comandes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer EL_TEU_TOKEN" \
-d '{"clientId":"cli_842","linies":[{"cafeId":"caf_001","quantitat":2}]}'
# -I fa una petició HEAD: només capçaleres, sense descarregar el cos
curl -I https://api.botigaaroma.example/v1/cafes
# -o desa en un fitxer i -s silencia la barra de progrés
curl -s https://api.botigaaroma.example/v1/cafes -o cafes.jsonUn detall útil: en fer servir -d, curl ja assumeix POST i Content-Type: application/x-www-form-urlencoded, per la qual cosa la capçalera Content-Type: application/json és obligatòria si envies JSON. Oblidar-la és una de les causes més freqüents de rebre un 400 desconcertant.
DevTools del navegador
Prem F12 al navegador i obre la pestanya Xarxa (Network). Amb ella pots:
- Filtrar per Fetch/XHR per veure només les crides a APIs que fa la pàgina, i ignorar imatges i estils.
- Clicar una petició i revisar-ne les pestanyes: Headers (línia de petició, codi d'estat i totes les capçaleres), Payload (el cos enviat), Response (el cos rebut) i Timing (on se n'ha anat el temps).
- Fer servir Copia com a cURL al menú contextual: converteix qualsevol petició del navegador en una ordre
curlreproduïble al terminal. És la tècnica més ràpida per depurar una crida que falla al web de la Botiga Aroma.
Un exercici molt formatiu: obre qualsevol botiga en línia real, filtra per Fetch/XHR i observa les crides que fa en afegir alguna cosa a la cistella. Hi veuràs en directe mètodes, rutes, codis d'estat i cossos JSON.
Errors Comuns i Consells
- Enviar JSON sense
Content-Type: application/json. El servidor no endevina el format; el tractarà com a text o com a formulari i fallarà en interpretar-lo. - Confondre
AcceptambContent-Type. Regla mnemotècnica: Content-Type descriu el que va dins d'aquest sobre; Accept descriu el que vull de tornada. - Posar dades sensibles a la query string. Les URL queden registrades als logs del servidor, als servidors intermediaris i a l'historial. Els tokens i les contrasenyes van a capçaleres o al cos, mai a la URL.
- Oblidar posar la URL entre cometes a
curlquan porta&. L'intèrpret la parteix i reps resultats incoherents. - Suposar que el servidor "recorda" la petició anterior. Sense estat vol dir exactament això: cada petició ha de ser autosuficient.
- Retornar
200 OKper als errors. Trenca memòries cau, reintents automàtics i monitoratge. - Preocupar-se per HTTP/2 o HTTP/3 al codi de l'API. És una decisió d'infraestructura; la teva feina és dissenyar bé el contracte.
- Consell: dedica quinze minuts a llançar
curl -vcontra tres o quatre APIs públiques que facis servir. Veure capçaleres reals de serveis reals ensenya més que qualsevol taula.
Exercicis
Exercici 1: llegir una petició en cru
Donada aquesta petició, respon: (a) quin mètode i ruta fa servir?; (b) a quin domini va dirigida?; (c) quin format envia i quin espera rebre?; (d) porta credencials?; (e) què està fent exactament?
PATCH /v1/cafes/caf_002 HTTP/1.1
Host: api.botigaaroma.example
Content-Type: application/json
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
{ "preuEuros": 13.50 }Exercici 2: descompondre una URL
Descompon aquesta URL en les seves sis parts i indica quina d'elles no arriba al servidor. Explica també si ?torrefaccio=clar&limit=10 identifica un recurs diferent o modula una consulta.
Exercici 3: construir peticions amb curl
Escriu les ordres curl per:
- Obtenir el cafè
caf_001mostrant les capçaleres de resposta. - Comprovar si existeix el recurs
/v1/cafes/caf_999sense descarregar-ne el cos. - Crear una ressenya amb
POST /v1/ressenyesenviant{"cafeId":"caf_001","puntuacio":5,"comentari":"Excel·lent"}autenticat amb el tokenTOKEN123. - Demanar els cafès d'Etiòpia amb torrefacció clara, amb la URL correctament entre cometes.
Solucions
Solució 1
- (a) Mètode
PATCHsobre la ruta/v1/cafes/caf_002. - (b) A
api.botigaaroma.example, indicat a la capçaleraHost(la línia de petició no porta mai el domini). - (c) Envia
application/json(Content-Type) i espera rebreapplication/json(Accept). - (d) Sí:
Authorization: Bearer ...amb un token. - (e) Modifica parcialment el cafè
caf_002, i en canvia només el preu a 13,50 €. Com que ésPATCHi noPUT, la resta de camps (nom,origen,estoc) es conserven. És una operació típica del panell intern, i per això requereix autenticació.
Solució 2
| Part | Valor |
|---|---|
| Esquema | https |
| Host | api.botigaaroma.example |
| Port | No indicat; s'assumeix 443 perquè és https |
| Ruta | /v1/cafes |
| Query string | ?torrefaccio=clar&limit=10 |
| Fragment | #resultats |
La part que no arriba al servidor és el fragment #resultats: el navegador el fa servir localment i no l'envia mai.
La query string modula la consulta: el recurs continua sent la col·lecció de cafès (/v1/cafes), però en demanem un subconjunt filtrat i limitat. No és un recurs diferent; és la mateixa col·lecció vista amb altres criteris. Per això els filtres van a la query string i no a la ruta.
Solució 3
# 1. Obtenir un cafè mostrant les capçaleres de resposta
curl -i https://api.botigaaroma.example/v1/cafes/caf_001
# 2. Comprovar-ne l'existència sense descarregar el cos (petició HEAD)
curl -I https://api.botigaaroma.example/v1/cafes/caf_999
# Retornaria 404 Not Found a la línia d'estat, sense cos
# 3. Crear una ressenya autenticada
curl -X POST https://api.botigaaroma.example/v1/ressenyes \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN123" \
-d '{"cafeId":"caf_001","puntuacio":5,"comentari":"Excel·lent"}'
# 4. Filtrar cafès (URL entre cometes per l'&)
curl "https://api.botigaaroma.example/v1/cafes?origen=Etiopia&torrefaccio=clar"Errors freqüents en aquest exercici: oblidar Content-Type al punt 3 (el servidor no interpretaria el JSON), fer servir -X GET amb -I (són incompatibles: -I ja implica HEAD) i no posar entre cometes la URL del punt 4.
Conclusió
HTTP és el terreny sobre el qual es construeix tota la resta. Ja saps llegir una petició i una resposta en cru, distingir-ne les tres parts, descompondre una URL i reconèixer les capçaleres que apareixeran a cada lliçó del curs. Has vist que l'absència d'estat obliga que cada petició sigui autosuficient —i alhora és el que permet escalar—, que les famílies de codis separen clarament la culpa entre client i servidor, que HTTPS no és opcional i que les versions del protocol canvien el transport però no el model. I, sobretot, ja tens dues eines, curl -v i les DevTools, per observar el que passa de debò en comptes de suposar-ho.
Amb aquest material podem abordar la pregunta central del mòdul. A la lliçó següent, Principis bàsics de REST, veurem com Roy Fielding va convertir les propietats del web en sis restriccions arquitectòniques, què són exactament un recurs, un identificador i una representació, i per què moltes APIs que s'anuncien com a REST no ho són del tot.
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
