<div class="section">
    <h2 class="section-title">Il Protocollo HTTP</h2>
    <hr class="spacerline">
    <div class="card">
        <p class="paragraph">
            Il protocollo HTTP rappresenta la backbone della comunicazione web. Senza la sua applicazione la principale metodologia di comunicazione in internet si svolgerebbe attraverso linea di comando, molto scomoda e poco pratica. Venne progettato inizialmente per lo scambio di ipertesto, ovvero informazioni testuali potenziate da immagini, audio e più avanti anche della logica.
        </p>
    </div>
</div>

<div class="image-container">
    <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Internet1.svg/2000px-Internet1.svg.png">
</div>

<div class="section">
    <h2 class="section-title">Architettura Client-Server</h2>
    <hr class="spacerline">
    <div class="card">
        <p class="paragraph">
            Si basa sul modello client-server, che è alla base di gran parte dell'interazione tra browser e server su Internet. Nel contesto del modello client-server, il client è il dispositivo o l'applicazione che richiede risorse o servizi, mentre il server è il sistema che fornisce tali risorse o servizi in risposta alle richieste del client.
        </p>
    </div>
</div>

<div class="section">
    <h2 class="section-title">Garantire l’Integrità dei dati</h2>
    <hr class="spacerline">
    <div class="card">
        <p class="paragraph">
            Il database deve poter garantire l'integrità e la coerenza dei dati sempre; deve, quindi, garantire una
            affidabilità dei dati ineccepibile. Un database implementato presenta dei metodi per evitare a tutti i
            costi i possibili accadimenti che rendono un dato non più veritiero, ad esempio blocca i dati che sono
            in fase di modifica, quindi non consente modifiche contemporanee in modo da evitare le race condition.
        </p>
    </div>
</div>

<div class="section">
    <h2 class="section-title">La sua qualità Stateless</h2>
    <hr class="spacerline">
    <div class="card">
        <p class="paragraph">
            Il protocollo HTTP utilizza una connessione di tipo stateless, il che significa che ogni richiesta del client è indipendente dalle precedenti e non mantiene alcuna informazione sul client una volta chiusa. Questo semplifica le cose notevolmente. Tuttavia, con l’avvento delle pagine web dinamiche è diventato necessario poter gestire informazioni di stato, come le sessioni utente. In questo caso sono spesso impiegati i cookie che mantengono informazioni sulla sessione sia sul server che nel dispositivo del client.
        </p>
    </div>
</div>

<div class="section">
    <h2 class="section-title">Principali funzioni del protocollo</h2>
    <hr class="spacerline">
    <div class="card">
        <p class="paragraph">
            La connessione HTTP avviene tramite una connessione TCP che garantisce la completa integrità dei dati. La connessione viene avviata attraverso il metodo CONNECT che genera appunto questa richiesta TCP e crea il tunnel.
        </p>
    </div>
    <div class="section-container">
        <div class="card card-row">
            <p class="paragraph">
                Per ottenere i dati, il client effettua una richiesta GET. La funzione punta l’indirizzo dove il dato necessario è situato e Il server restituisce le informazioni richieste. Abbiamo avuto modo di utilizzare questa richiesta in classe per ottenere dei dati in formato JSON da un server online, tuttavia non è ristretta a ciò, può prelevare anche dati html, script, audio, immagini e così via. Il server effettua una risposta HTTP per restituire i dati.
            </p>
        </div>
        <div class="card card-row">
            <p class="paragraph">
                La funzione HEAD, può essere comparata al metodo GET, infatti effettua una richiesta al server per ottenere i dati di un ipotetico sito. In questo caso, però, vengono restituiti solamente le intestazioni, senza l’intero corpo del sito.
            </p>
        </div>
    </div>

    <div class="image-container">
        <img src="https://kikobeats.github.io/server-sandbox/assets/http-commands.png">
    </div>

    <div class="card">
        <p class="paragraph">
            Il metodo PUT è utilizzato per creare delle risorse all’interno del server. L’URI definito va ad indicare un oggetto che è impostato per ricevere dei dati. Andando a ricevere il dato poi questo lo va a scrivere nella memoria di massa del server. Come esempio possiamo pensare alla scrittura di un commento in un forum. Questo viene salvato nella memoria e visualizzato solo con delle nuove richieste. (non dinamico)
        </p>
    </div>
    <div class="card">
        <p class="paragraph">
            Il metodo POST, è molto simile al PUT infatti permette anch’esso di creare o scrivere risorse ma la particolarità che lo differenzia è che permette di inviarle ad un indirizzo che le possa processare in maniera dinamica quindi uno script in esecuzione. Ad esempio si può pensare ad un tabellone online dove le note appese sono aggiornate dinamicamente, senza quindi dover aggiornare la pagina.
        </p>
    </div>
    <div class="card">
        <p class="paragraph">
            Il metodo DELETE è autoesplicativo e permette appunto di eliminare una risorsa all’interno del server. È necessario uno speciale permesso per poter eliminare il file quindi per poter essere accettato è necessario autenticare la sessione, cosa che suppongo faremo in classe in futuro.
        </p>
    </div>
    <div class="card">
        <p class="paragraph">
            Il metodo OPTIONS è un metodo meno utilizzato e permette di conoscere le funzionalità del server ad esempio la versione del protocollo HTTP che utilizza.
        </p>
    </div>
    <div class="card">
        <p class="paragraph">
            Il metodo TRACE è anch’esso uno dei meno utilizzati. Questo permette di verificare il percorso che il dato inviato segue per raggiungere il server. È analogo al comando TRACERT che abbiamo in windows (ma quello utilizza il protocollo ICMP)
        </p>
    </div>
    <div class="card">
        <p class="paragraph">
            NOTA: Una risposta HTTP segue sempre uno schema che include in valore numerico di risposta (come 200 OK o 404 Not Found), gli header della risposta e un body che contiene i dati richiesti.
        </p>
    </div>
</div>