GET /pagina1.html HTTP/1.1 Host: www.w3.org User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/118.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: it-IT,it;q=0.8,en;q=0.3 Accept-Encoding: gzip, deflate
Quello qui sopra è un esempio di richiesta, guardando con un po' di attenzione si può vedere che il formato è piuttosto ripetitivo... con una eccezione.
Quale è l'eccezione?
la prima rigasi, non è "nome: valore" la terza rigano, la lunghezza non è indicativaLa prima riga contiene tre informazioni separate da uno spazio:
- metodo
- percorso
- versione
Metodo
Potremmo dire che in qualche modo è l'azione da eseguire sull'oggetto riferito dalla URI, i metodi più comuni sono:
- HEAD
- ritorna soltanto la parte header della risposta HTTP
- GET
- voglio recuperare il contenuto di una risorsa (ad esempio di un file), se eseguo tante volte la stessa richiesta con questo metodo ottengo sempre lo stesso risultato (si da per assunto che questa richiesta non implichi la modifica dell'oggetto che viene richiesto), la richiesta non ha corpo ed eventuali parametri vengono inseriti nella URL
- POST
- voglio creare una risorsa oppure voglio inviare delle informazioni ad uno script che plausibilmente modificheranno lo stato del server, se invio più volte la stessa richiesta potrei ottenere risultati diversi come risposta, eventuali parametri vengono inseriti nel corpo della richiesta
- PUT
- voglio rimpiazzare una risorsa già presente sul server
- PATCH
- voglio rimpiazzare soltanto delle parti di una risorsa, è il metodo più nuovo e non sempre è supportato
- DELETE
- è la richiesta di cancellazione di una risorsa
percorso
È il percorso all'interno del server della risorsa richiesta
(ad esempio /home/pagina.html
).
Questo percorso non fa riferimento al disco di sistema del server ma alla cartella principale di servizio del server http con cui si dialoga.
versione
Nel nostro caso è praticamente sempre HTTP/1.1
Headers
Tutte le righe che seguono la prima fino alla prima riga vuota sono
scritte nello stesso formato nome: valore
e contengono varie
informazioni utili al server per gestire la richiesta.
Gli header possibili sono tantissimi (è possibile trovarne un elenco nelle pagine MDN HTTP headers, Wikipedia (en) o html.it ) e possono anche essere creati all'occorrenza ma alcuni di uso comune li vediamo in dettaglio.
User-Agent
Nel nostro caso è Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0
e riporta delle informazioni sul programma con cui l'utente sta inviando
le informazioni. Praticamente tutti i browser riportano "Mozilla/5.0" all'inizio
(e WebAIM riporta il perché),
successivamente possiamo vedere alcune informazioni riguardanti la macchina, il sistema operativo
e la versione del browsers in uso.
Accept
Con questo header il client dice al server in che formato vuole avere la risorsa richiesta, la maniera che usa per farlo è piuttosto articolata: un elenco di possibilità separate da ",".
Ogni possibilità è fatta da due parti di cui la seconda è opzionale: la prima parte è
il tipo mime (
su Wikipedia o su
IANA
) e la seconda è il livello di preferenza espresso con un numero nell'intervallo [0,1].
La parte preferenza si riconosce perché inizia con q=
e se manca per
default è 1.
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
parafrasi: voglio un testo html (lo preferisco al 100%), oppure un file xhtml (va sempre bene al 100%), un file xml con preferenza al 90%, qualsiasi altra cosa mi va bene all'80%.
Accept-Language
Il formato è lo stesso di accept soltanto che la prima parte di ogni coppia è un locale (ce ne sono molti, questa ad esempio è la lista di quelli supportati da java) anziché un tipo mime.
Quale è il linguaggio che preferisco in assoluto se invio l'header
Accept-Language: en-US,en-AU;q=0.8,en;q=0.3
?
Quale è il linguaggio che preferisco in caso non sia disponibile l'inglese americano?
Accept-Language: en-US,en-AU;q=0.8,en;q=0.3
?
Accept-Encoding
Un elenco di formati di compressione dei dati che il client è in grado di interpretare.
Host
Sembra strano che io debba specificare il nome dell'host visto che sto parlando con lui... in verità però il server che mi risponde potrebbe gestire molti siti diversi e quindi sapere con quale intendo parlare gli è necessario per fornirmi il contenuto opportuno.
Corpo
Non è presente nel nostro esempio ma in generale dopo gli headers si trova una riga vuota seguita dall'oggetto che si vuole trasferire.