Protocollo HTTP cos'è e come funziona

Pubblicato da Flavio Biscaldi Aggiornato il

HTTP (HyperText Transfer Protocol)

Questo primo articolo del blog parla di ciò che è alla base del funzionamento di Internet, e quindi di tutti i siti web: il protocollo HTTP.

Andremo ad analizzare cos'è HTTP, il suo funzionamento e come visualizzare i messaggi HTTP inviati tramite la rete.

Cos'è HTTP

HTTP (Hypertext Transfer Protocol, letteralmente protocollo di trasferimento di un ipertesto) è un linguaggio di testo che consente la comunicazione tra client e server attraverso internet. Nell'istante in cui hai aperto questa pagina si è verificata la seguente conversazione tra il tuo browser (il client) e il server su cui è ospitata la risorsa /blog/protocollo-http-cosa-e-come-funziona

HTTP Request e Response

HTTP è qualcosa che utilizzi ogni giorno, in particolare quando visiti un sito web per consultare una risorsa o per compilare un modulo di richiesta informazioni.

Come funziona HTTP: request e response

Dopo aver introdotto brevemente il protocollo HTTP adesso vediamo il suo funzionamento passo passo, analizzando come è fatta una richiesta HTTP e la successiva risposta da parte del server.

Request: il client invia una richiesta

Ogni conversazione tra client e server sul web inizia con una richiesta, un messaggio di testo creato dal client in un formato speciale noto appunto come HTTP.

Una richiesta HTTP è composta dalle seguenti parti:

[method] [URI] [version]
[headers]
[body]

Tornando all'esempio precedente la richiesta tradotta in HTTP sarebbe qualcosa del genere

GET /blog/protocollo-http-cosa-e-come-funziona HTTP/1.1
Host: www.flaviobiscaldi.it
Accept: text/html
User-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64)

Questo semplice messaggio comunica tutto ciò che è necessario riguardo la risorsa che il client sta richiedendo.

La prima riga di una richiesta HTTP è la più importante e contiene due parti fondamentali:

  1. il metodo HTTP (GET)
  2. l'URI (/blog/protocollo-http-cosa-e-come-funziona)

L'URI è l'indirizzo o il percorso univoco che identifica la risorsa che il client desidera. Il metodo HTTP definisce ciò che il client vuole fare con la risorsa.

Request methods: metodi di una richiesta HTTP

I metodi HTTP definiscono i modi in cui il client può interagire con la risorsa. La tabella seguente mostra alcuni dei metodi utilizzati durante una richiesta HTTP.

Metodo Descrizione
GET Recupera una risorsa dal server (ad es. visitando una pagina)
POST Invia una risorsa al server (ad. es compilando un modulo)
DELETE Cancella una risorsa dal server (ad es. eliminando un file)
PUT Memorizza una risorsa sul server (as es. caricando un file)
HEAD Recupera solo l'header della risposta senza la risorsa

Esistono altri metodi definiti dalle specifiche del protocollo HTTP, ma molti di essi sono poco utilizzati o non supportati. In realtà, molti browser moderni supportano solo GET e POST.

Request headers: intestazioni di richiesta

Oltre alla prima riga, una richiesta HTTP contiene altre informazioni chiamate intestazioni di richiesta (request headers).

Le intestazioni forniscono molte informazioni supplementari come l'host dove si trova la risorsa (Host), i formati di risposta accettati dal client (Accept) e l'applicazione utilizzata dal client per effettuare la richiesta (User-Agent).

Intestazione Descrizione
Host Specifica il server dove è ospitata la risorsa richiesta
Accept Specifica quali formati di file (i MIME Type) sono accettati dal client
Accept-Language Indica quale lingua supporta il client
Accept-Charset Indica il set di caratteri accettato dal client
User-Agent Specifica quale applicazione sta effettuando la richiesta

Per approfondire leggi HTTP request headers

Response: il server restituisce una risposta

Il client invia la richiesta al server, quindi attende la risposta (response). L'obiettivo del server è quindi di interpretare la richiesta del client e restituire una risposta.

Una volta che il server ha ricevuto la richiesta, conosce esattamente la risorsa di cui il client ha bisogno (tramite l'URI) e ciò che il client vuole fare con quella risorsa (tramite il metodo).

Ad esempio, nel caso di una richiesta GET, il server prepara la risorsa e la restituisce in una risposta HTTP.

Come per la richiesta, una risposta HTTP è composta dalle seguenti parti:

[version] [status code] [reason]
[headers]
[body]

Tradotto in HTTP, la risposta inviata al browser sarà simile a questa

HTTP /blog/protocollo-http-cosa-e-come-funziona 1.1 200 OK
Date: Wed, 08 Aug 2018 21:23:53 GMT
Connection: keep-alive, Keep-Alive
Content-Encoding: br
Server: Apache
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
    <head>
       <title>Protocollo HTTP: cos'è e come funziona passo passo</title>
    </head>
</html>

La risposta HTTP contiene la risorsa richiesta (il contenuto HTML in questo caso), più altre importanti informazioni come il codice di stato della risposta.

Status Codes: codici di stato HTTP

Il codice di stato comunica il risultato della richiesta al client. In questo caso 200 indica che la richiesta è andata a buon fine.

Esistono diversi codici di stato che indicano il successo, un errore o che il client deve fare qualcosa (ad esempio reindirizzare l'utente a un'altra pagina).

La tabella mostra alcuni dei codici di stato più frequenti.

Codice Descrizione
200 OK La richiesta è andata a buon fine
301 Moved Permanently La risorsa richiesta è stata spostata definitivamente ad un nuovo URI
404 Not Found La risorsa richiesta non è stata trovata
500 Internal Server Error Errore generico causato di solito da una configurazione errata del server

Per approfondire leggi codici di stato HTTP

Response headers: intestazioni di risposta

Come la richiesta, anche una risposta HTTP contiene informazioni aggiuntive note come intestazioni di risposta HTTP (response headers). Il corpo della stessa risorsa può essere restituito in più formati diversi come HTML o JSON e l'intestazione Content-Type utilizza tipi di MIME, come ad esempio text/html, per dire al client quale formato viene restituito.

Intestazione Descrizione
Content-Encoding Tipo di codifica utilizzata sui dati dal server
Content-Type Indica il MIME Type dei dati (Es. text/html)
Date La data e l'orario in cui i dati sono stati inviati
Server Nome del server web utilizzato

Per approfondire leggi HTTP response headers

Come visualizzare request, response e HTTP headers

Ci sono diversi modi per visualizzare e analizzare i messaggi del protocollo HTTP scambiati durante una conversazione tra client e server. Eccone alcuni.

La DevTools di Chrome

Col browser di casa Google hai a disposizione la DevTools, uno strumento intregrato nel browser che aiuta lo sviluppatore nella diagnostica di un'applicazione web.

Puoi visualizzare la DevTools da Opzioni -> Altri strumenti -> Strumenti per sviluppatori o tramite scorciatoia da tastiera Ctrl+Maiusc+C (se usi Windows).

Una volta aperta la finestra posizionati nella tab "Network" e premi F5, quindi dalla colonna "Name" seleziona una risorsa qualunque e sulla destra verranno visualizzate le colonne Headers, Preview, etc... come mostrato in figura.

Chrome DevTools

In Firefox esiste uno strumento molto simile attivabile sempre dalle opzioni del browser.

La variabile globale $_SERVER in PHP

In PHP abbiamo la variabile globale $_SERVER per accedere a numerose informazioni di un ciclo richiesta/risposta HTTP, comprese le intestazioni.

Il seguente codice di esempio stampa a video l'URI e l'Host della risorsa che stai leggendo.

<?php

// Recupero URI e host della richiesta HTTP

$uri = $_SERVER["REQUEST_URI"];
$host = $_SERVER["HTTP_HOST"];

// Preparo la risposta HTTP tramite la funzione header() e stampo info della richiesta

header('Content-type: text/html');
echo "La risorsa ".$uri." è hostata su ".$host;

// Outuput
// La risorsa /blog/protocollo-http-cosa-e-come-funziona è hostata su www.flaviobiscaldi.it

Per approfondire leggi variabile globale $_SERVER

Conclusioni

In questo articolo abbiamo visto cos'è HTTP e il suo funzionamento. Ogni sviluppatore web dovrebbe averne conoscenza in quanto rappresenta uno dei protocolli base di Internet assieme ai protocolli TCP/IP.

Inoltre capire come funziona HTTP e come le intestazioni interagiscono tra client e server può aiutarci a migliorare l'esperienza utente, fornendoci preziose informazioni per la risoluzione di problemi su applicazioni web particolarmente lente.

Nel prossimo articolo analizzeremo invece HTTPS, il suo funzionamento e i motivi per cui oggi non conviene più avere un sito su protocollo HTTP.