Quando un browser effettua una richiesta HTTP, appare come segue:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
... a cui il server dovrebbe inviare una risposta simile a questa:
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
Qualsiasi codice in esecuzione sul server che ascolta le richieste su un socket TCP, legge la richiesta e le risposte con la risposta appropriata sono sufficienti. Un modo stupido è solo per sputare una risposta in scatola a chiunque si connetta alla porta TCP 80, usando uno script di shell:
$ nc -l 8000 <<'RESPONSE'
HTTP/1.0 200 Success
Content-Type: text/html; charset=UTF-8
Content-Length: 1337
<!DOCTYPE html>
<html>
<head><title>cats - Google Search</title>
<body>
<h1>About 415,000,000 results</h1>
…
</body>
</html>
RESPONSE
Naturalmente, questa tecnica appare a malapena conforme al protocollo HTTP .
Un passo avanti rispetto a questa risposta predefinita è questo semplice programma Python, che usa il http.server
in Python 3.
#!/usr/bin/python3
import http.server
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
payload = '<!DOCTYPE html>... insert cats here ...'.encode('UTF-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=UTF-8')
self.send_header('Content-Length', len(payload))
self.end_headers()
self.wfile.write(payload)
http.server.HTTPServer(('', 80), Handler).serve_forever()
Il server HTTP può essere scritto in qualsiasi lingua; questo è solo un esempio. Ovviamente, questo esempio è molto rudimentale. Il payload è hardcoded: il programma ignora completamente il contenuto della richiesta: l'URL, la stringa di query, l'intestazione Accept-Language, ecc. È possibile aggiungere codice per generare risposte significative in base alla richiesta, ma il codice otterrebbe molto complesso. Inoltre, i programmatori preferirebbero concentrarsi sulla scrittura dell'applicazione web, senza doversi preoccupare dei dettagli su come gestire una richiesta HTTP.
Una soluzione più appropriata sarebbe quella di utilizzare un server web, come Apache HTTPD , IIS o nginx . Un server Web è solo un programma che ascolta i socket TCP rilevanti, accetta richieste multiple (possibilmente contemporaneamente) e decide come generare una risposta basata sull'URL, le intestazioni e altre regole della richiesta. Idealmente, molti dei dettagli, come SSL, controllo degli accessi e limiti delle risorse vengono gestiti tramite la configurazione anziché il codice. Per la maggior parte del tempo, il server Web formulerà una risposta costituita solo dal contenuto dei file nel filesystem.
Per i contenuti dinamici, tuttavia, il server Web può essere configurato per eseguire codice per generare la risposta. Un meccanismo per farlo è con CGI: il server imposta alcune variabili d'ambiente in base alla richiesta, esegue un programma e ne copia l'output sul socket TCP. Una soluzione leggermente più sofisticata sarebbe quella di avere un modulo che aggiunge supporto al server Web per chiamare il codice in un altro linguaggio di programmazione (ad esempio mod_php per Apache ). Un'altra opzione è scrivere il server web nella stessa lingua dell'applicazione web, nel qual caso l'invio della richiesta è solo una chiamata di funzione. È il caso di node.js e di motori servlet Java come Apache Tomcat .
La scelta della tecnologia dipende solo da te, e dipende dal linguaggio di programmazione che preferisci utilizzare, dall'ambiente di hosting a tua disposizione, dai requisiti di rendimento, dall'opinione pubblica e dalle mode passeggere. CGI, ad esempio, non è stato favorito ultimamente, poiché la necessità di avviare programmi esterni limita la scalabilità.