richiestaHttp

cosa contiene e come è formattata una richiesta http

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 è indicativa

La prima riga contiene tre informazioni separate da uno spazio:

  1. metodo
  2. percorso
  3. 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?

l'inglesenon è molto precisa come risposta l'inglese americanogiusto, en-US sta appunto per questo l'inglese australianono, il suo livello di preferenza non è il più alto

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?

l'ingleseno, questa sarebbe la terza scelta l'inglese americanono, abbiamo detto che non era disponibile l'inglese australianosi, mi va bene all'80%

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.