Lezione 3 - Metodi HTTP e codifica URL
Anno 5 · Modulo 1 · Lezione 3
Sistemi e Reti · Prof. Giagnotti · ITT Informatica

Metodi HTTP e codifica URL (HTTP Request Response)

Come il client dice al server cosa vuole fare: i verbi HTTP, dove viaggiano i parametri e perché un indirizzo web non può contenere spazi o simboli a caso. Dal CRUD alla query string, fino al percent-encoding.

📚 Anno 5 · Modulo 1 ⏱ 50 min lettura 🔧 GET • POST • PUT • DELETE • URL encoding
// Obiettivi di apprendimento
✓Descrivere i principali metodi HTTP (GET, POST, PUT, DELETE) e associarli alle operazioni CRUD
✓Spiegare la differenza tra passaggio di parametri con GET e POST, indicando vantaggi, limiti e implicazioni su cache e sicurezza
✓Applicare la codifica URL (percent-encoding) per trasformare stringhe con caratteri speciali in formato trasmissibile
✓Costruire correttamente una query string con coppie nome=valore separate da &
✓Riconoscere quando usare form HTML con method GET/POST e debuggare la richiesta con DevTools

1. I metodi HTTP: i verbi del web

📌 Definizione — Metodo HTTP

Un metodo HTTP (detto anche verbo) indica l'intenzione del client: dice al server che operazione vuole eseguire sulla risorsa identificata dall'URL. È la prima parola della request line: GET /index.html HTTP/1.1

In una comunicazione client-server, l'URL da solo non basta: /utenti/42 potrebbe voler dire “dammi l'utente 42” oppure “cancella l'utente 42”. A distinguerle è il metodo. Senza metodo, il server non sa se deve leggere, creare, aggiornare o eliminare.

🎯 Esempio in classe — registro elettronico

Immagina l'app del registro: quando apri /assenze?data=2026-05-13 fai un GET (sei in lettura). Quando premi “Inserisci assenza” e invii il form, il browser fa POST. Quando il docente modifica l'assenza, frontend invia PUT su /assenze/123. Quando la annulla, invia DELETE.

💬 Tip del docente

Per ricordarti i verbi all'interrogazione, usa la frase: “Get legge, Post produce, PUT apposto, DELETE distrugge”. Suona sciocca, ma funziona al 100% in verifica.

2. CRUD ↔ HTTP: la mappa che devi ricordare

Le quattro operazioni fondamentali sui dati sono CRUD: Create, Read, Update, Delete. HTTP ha un verbo dedicato per ciascuna. In 5° ti bastano i 4 base, ma esistono anche PATCH (update parziale), HEAD, OPTIONS.

01 · READ

GET

Recupera una risorsa. Non deve modificare lo stato server. Idempotente e cacheable. È il 90% del traffico web.

02 · CREATE

POST

Crea una nuova risorsa subordinata. Non idempotente. Dati nel body. Es: registrazione, nuovo articolo.

03 · UPDATE / DELETE

PUT · DELETE

PUT sostituisce completamente una risorsa a URI noto. DELETE la rimuove. Entrambi idempotenti per definizione.

MetodoCRUDIdempotente?Descrizione operativa
GETReadSìRichiede pagina HTML, immagine, JSON API. Mai effetti collaterali previsti.
POSTCreateNoInvia dati per creare (nuovo utente). Il server decide l'URI finale e risponde 201.
PUTUpdate (replace)SìCarica/aggiorna risorsa a URI noto, sostituzione completa.
DELETEDeleteSìRimuove la risorsa a quell'URI. Se già cancellata, risposta uguale.
CLIENT Request line GET /api/users SERVER WEB ↔ LOGICA CRUD GET → READ 200 OK + body POST → CREATE 201 Created PUT → UPDATE idempotente DELETE → DELETE HTTP Response: Status + Headers + Body
⚠️ Errore comune in verifica

Dire che “POST è sicuro perché nasconde i parametri”. Falso: POST li sposta nel body, ma senza HTTPS sono leggibili con DevTools o Wireshark. La sicurezza la dà HTTPS/TLS, non il verbo.

3. GET vs POST: dove viaggiano i parametri

📌 Definizione — Query string vs Body

Con GET i parametri sono nell'URL dopo il ? come nome=valore&nome2=valore2. Con POST sono nel body della richiesta HTTP, quindi non compaiono nella barra degli indirizzi, ma sono comunque ispezionabili.

Questo dettaglio cambia tutto: condivisibilità, cache, lunghezza massima, log del server, cronologia browser.

AspettoGET (? nell'URL)POST (nel body)
Visibilità URLSì, tutto in chiaro in barraNo, non in URL (ma visibile in DevTools Network)
LunghezzaLimitata ~2000 char praticiVirtualmente illimitata (limite server/php.ini)
Cache / BookmarkSì, cacheable e salvabile nei preferitiNo, non cacheable né linkabile
File uploadImpossibileSì, con multipart/form-data
Log e privacyParametri in log server e cronologiaMeno esposti, ma solo HTTPS li protegge davvero
HTTP · ESEMPIO GET vs POST
GET /ricerca?q=reti+informatiche&pag=2 HTTP/1.1 Host: profgiagnotti.altervista.org Accept: text/html-------------------------------POST /login HTTP/1.1 Host: profgiagnotti.altervista.org Content-Type: application/x-www-form-urlencoded Content-Length: 32username=mario.rossi&password=12345NOTA: Con HTTPS tutto dopo Host è cifrato. Senza HTTPS, Wireshark legge tutto in chiaro.
🎯 Esempio in classe — form ricerca e login

Form ricerca biblioteca: method="GET" così puoi copiare il link /cerca?titolo=TCP e mandarlo al compagno. Form login: method="POST" altrimenti password finirebbe nella cronologia del browser e nei log del proxy scolastico! Per questo i siti seri usano POST + HTTPS + HttpOnly cookie.

4. Struttura della query string

La query string è la parte dell'URL che inizia dopo il carattere ?. È composta da coppie chiave=valore separate da &. Se valore contiene caratteri speciali, va codificata altrimenti spacca il parsing.

URL · ANATOMIA QUERY STRING
https://www.esempio.it/index.php?nome=mario&cognome=rossi&citta=Roma%20Est \____/ \_____________/ \________/ \_____________________________________/ schema host+path (no query) query string ^ ^ ? una sola & separa le coppieRegole: - ? inizia la query string (una sola) - & separa le coppie - = separa nome da valore - valori vuoti ammessi: ?flag=&debug=1 - chiavi ripetute ?id=1&id=2 spesso interpretate come array
💬 Tip del docente

L'ordine delle coppie di solito non conta per il server, ma conta per cache e firma HMAC. In JavaScript usa sempre URLSearchParams invece di concatenare stringhe a mano: evita 90% degli errori di codifica.

5. La codifica URL – percent-encoding

📌 Definizione — URL Encoding / Percent-encoding

La codifica URL trasforma ogni carattere non sicuro in %XX dove XX è il codice ASCII in esadecimale. Negli URL sono permessi solo unreserved: A-Z a-z 0-9 - _ . ~ . Tutto il resto va codificato.

Senza codifica, un carattere come & verrebbe confuso con il separatore di parametri, lo spazio spezzerebbe l'URL, % stesso creerebbe ambiguità perché è il carattere di escape.

Stringa originale Rossi & Martini Srl → Individua non sicuri spazio→%20 &→%26 → Codificata finale Rossi%20%26%20Martini%20Srl Es: ?soc=Rossi & Martini → ambiguo! ASCII → hex Server decodifica automaticamente ?societa=Rossi%20%26%20Martini%20Srl&iva=123 — & del nome non è separatore
🎯 Esempio step-by-step — prima e dopo

Originale: societa=Rossi & Martini → se la metti in URL così, il parser vede due parametri: societa=Rossi e Martini (senza valore). Codificata: societa=Rossi%20%26%20Martini → ora il server riceve esattamente “Rossi & Martini”. Lo spazio %20 e la & %26 non sono più separatori.

CarattereCodificaPerché si codificaNota pratica
(spazio)%20 o +Spazio non ammesso in URLIn query string + = spazio (legacy form)
&%26Separatore coppieSe non codifichi, tronca la coppia
=%3DAssegnazione nome=valoreAmbiguità se nel valore
%%25È il carattere di escape stessoVa codificato per primo!
+%2BPotrebbe essere letto come spazioTelefono +39 va %2B39
@ / : ? #%40 %2F %3A %3F %23Riservati in URI (path, query)Codifica solo se compaiono nei valori

Procedura di codifica corretta

  1. Identifica i caratteri non unreserved: tutto ciò che non è A-Z a-z 0-9 - _ . ~
  2. Converti ogni carattere in byte ASCII e poi in %XX esadecimale maiuscolo (es. spazio 32 → 0x20 → %20)
  3. Costruisci coppie con encodeURIComponent(nome)=encodeURIComponent(valore) e uniscile con &
JAVASCRIPT · ENCODE CORRETTO
// SBAGLIATO: concatenazione manuale spacca tutto let urlErr = "/api?q=" + "Rossi & Martini"; // → interprete vede & come separatore!// CORRETTO in JS moderno: const params = new URLSearchParams({ societa: "Rossi & Martini Srl", citta: "Roma Est", tel: "+39 06 123456" }); console.log(params.toString()); // societa=Rossi+%26+Martini+Srl&citta=Roma+Est&tel=%2B39+06+123456// PHP backend: // urlencode("Rossi & Martini") → Rossi+%26+Martini per query string // rawurlencode("path/part") → per segmento di path// Python: // from urllib.parse import quote_plus, quote // quote_plus("Rossi & Martini") → Rossi+%26+Martini
⚠️ Errore da evitare — doppia codifica

Se codifichi due volte: %20 → %2520 perché % diventa %25. Il server allora vede letteralmente “%20” e non uno spazio. Codifica una sola volta e solo i valori, non l'intera URL già pronta!

6. Form HTML, DevTools e Postman in pratica

In laboratorio lo vedi subito: un form con method GET crea una query string visibile. Con POST la vedi solo in DevTools → Network → Payload/Form Data.

HTML · DUE FORM A CONFRONTO
<!-- Ricerca condivisibile: GET --> <form method="GET" action="/cerca"> <input name="q" value="metodi http"> <input name="pag" value="1"> <button>Cerca</button> </form> <!-- Risultato URL: /cerca?q=metodi%20http&pag=1 --><!-- Login: deve essere POST + HTTPS --> <form method="POST" action="/login"> <input name="username"> <input type="password" name="password"> <button>Accedi</button> </form> <!-- DevTools Network -> Headers: Request URL: /login Form Data: username=mario&password=... (codificata) -->
LAB · DEVTOOLS

Chrome F12 → Network

Filtra per Doc/Fetch/XHR, clicca la richiesta, leggi Method, Query String Parameters, Form Data e confronta GET vs POST reali.

LAB · POSTMAN

POST con body

Crea POST a https://httpbin.org/post con body x-www-form-urlencoded contenente & e spazi. Postman codifica automaticamente, prova a disattivare.

SICUREZZA

HTTPS obbligatoria

GET e POST senza TLS mostrano tutto in Wireshark → Follow HTTP Stream. Con HTTPS vedi IP + SNI, ma non path, query o body.

🎯 Debug reale — httpbin

Apri httpbin.org/get?citta=Roma Est&azienda=Rossi & Martini senza codifica: il server vede azienda=Rossi e un parametro vuoto Martini. Se codifichi ?azienda=Rossi%20%26%20Martini, il server riceve correttamente Rossi & Martini nel campo args.

7. Verifica / Esercizio

🔬 Attività — costruisci la richiesta giusta

Scenario: mini-app contatti scolastici con API: GET /api/contatti?q=...&citta=..., POST /api/contatti, PUT /api/contatti/{id}, DELETE /api/contatti/{id}. Dati test: cognome "De Luca", azienda "Rossi & Figli", città "L'Aquila", nota "Tel. +39 0862 123456".

  1. Scrivi URL completo per cercare “De Luca” a “L'Aquila” usando GET, con codifica corretta.
  2. Per creare un contatto con azienda “Rossi & Figli”, che metodo usi? Dove metti i dati e perché? Scrivi body x-www-form-urlencoded codificato.
  3. Spiega perché usare GET per il login è un errore (cita cache, log, cronologia, referer).
  4. Cosa succede se invii ?azienda=Rossi & Figli senza codifica? Quanti parametri vede il server?
  5. Con DevTools, fai POST a https://httpbin.org/post con i dati sopra. Quali header indicano che i dati sono nel body?
✅ Soluzione ragionata

1) GET codificata: /api/contatti?q=De%20Luca&citta=L%27Aquila (spazio %20, apostrofo %27). Con URLSearchParams: q=De+Luca&citta=L%27Aquila è ok perché + = spazio in QS. Mai lasciare spazi veri.

2) POST per Create: POST su /api/contatti. Dati nel body perché è creazione di nuova risorsa subordinata e contiene speciali + lunghi. Body: nome=...&azienda=Rossi%20%26%20Figli&citta=L%27Aquila&nota=Tel.%20%2B39%200862%20123456 con Content-Type: application/x-www-form-urlencoded.

3) GET per login NO: URL /login?user=mario&pass=123 resta in cronologia browser, log proxy scolastico, header Referer se clicchi link esterno, può essere cacheato, bookmarkato e indicizzato. POST + HTTPS evita leak in URL (ma non da keylogger o shoulder surfing).

4) Senza codifica: ?azienda=Rossi & Figli → parser spacca su &. Server legge azienda=Rossi e poi parametro vuoto " Figli" (o " Figli="). Dati persi e bug difficile da trovare.

5) Header POST: method: POST, Content-Type: application/x-www-form-urlencoded, Content-Length, payload in Form Data. In Wireshark senza TLS → Follow TCP Stream mostra tutto chiaro.

✓Verbi HTTP = intenzione: GET legge, POST crea, PUT sostituisce, DELETE elimina. Mappa CRUD.
✓GET vs POST: GET parametri nell'URL (visibili, limitati, cacheable, bookmark), POST nel body (file upload, no limiti, non cacheable).
✓Query string: ? chiave=valore & ... Una sola ?, & separa, = assegna. Vuoti ammessi.
✓Percent-encoding: non-unreserved → %XX hex. Spazio %20/+, &→%26, %→%25, +→%2B. Codifica valori, non tutta URL.
✓Best practice: usa URLSearchParams / urlencode / quote_plus. Mai concatenazione manuale a stringa. Evita doppia codifica %25.
✓Sicurezza: POST non è sicurezza. Solo HTTPS (TLS) cifra path, query, header e body end-to-end.

📚 Prossimo passo — Il protocollo HTTP: struttura di request e response

Ora che sai cosa chiedi (metodo) e come passi i parametri, smontiamo la richiesta completa: request line, header, body e risposta con status code. Porta DevTools: leggeremo una richiesta vera byte per byte nella prossima lezione.