Wenn ein Browser eine HTTP-Anfrage stellt, sieht das so aus:
GET /search?q=cats HTTP/1.0
Host: www.google.com
Connection: close
… An die der Server eine Antwort senden soll, die so aussieht:
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>
Jeder auf dem Server ausgeführte Code, der auf Anforderungen an einem TCP-Socket wartet, die Anforderung liest und mit der entsprechenden Antwort antwortet, ist ausreichend. Eine blöde Methode besteht darin, eine vordefinierte Antwort mit einem Shell-Skript an jeden auszuspucken, der eine Verbindung zu TCP-Port 80 herstellt:
$ 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
Natürlich scheint diese Technik nur wenig mit dem HTTP-Protokoll übereinzustimmen .
Ein weiterer Fortschritt gegenüber dieser vorgefertigten Antwort ist dieses einfache Python-Programm, das die http.server
Bibliothek in Python 3 verwendet.
#!/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()
Der HTTP-Server kann in einer beliebigen Sprache geschrieben werden. das ist nur ein beispiel Offensichtlich ist dieses Beispiel sehr rudimentär. Die Nutzdaten sind fest codiert - das Programm ignoriert den Inhalt der Anforderung - die URL, die Abfragezeichenfolge, den Accept-Language-Header usw. - vollständig. Sie können Code hinzufügen, um auf der Grundlage der Anforderung aussagekräftige Antworten zu generieren Komplex. Außerdem möchten sich Programmierer lieber darauf konzentrieren, die Webanwendung zu schreiben, ohne sich um die Details der Behandlung einer HTTP-Anfrage kümmern zu müssen.
Eine geeignetere Lösung wäre die Verwendung eines Webservers wie Apache HTTPD , IIS oder Nginx . Ein Webserver ist lediglich ein Programm, das die relevanten TCP-Sockets überwacht, mehrere Anforderungen (möglicherweise gleichzeitig) akzeptiert und anhand der Anforderungs-URL, der Header und anderer Regeln entscheidet, wie eine Antwort generiert werden soll. Im Idealfall werden viele Details wie SSL, Zugriffskontrolle und Ressourcenbeschränkungen über die Konfiguration und nicht über Code geregelt. In den meisten Fällen formuliert der Webserver eine Antwort, die nur aus Inhalten aus Dateien im Dateisystem besteht.
Für dynamischen Inhalt kann der Webserver jedoch so konfiguriert werden, dass Code zum Generieren der Antwort ausgeführt wird. Ein Mechanismus dafür ist CGI: Der Server setzt einige Umgebungsvariablen basierend auf der Anforderung, führt ein Programm aus und kopiert seine Ausgabe in den TCP-Socket. Eine etwas komplexere Lösung wäre ein Modul, das den Webserver für den Aufruf von Code in einer anderen Programmiersprache (z. B. mod_php für Apache ) unterstützt. Eine weitere Möglichkeit besteht darin, den Webserver in derselben Sprache wie die Webanwendung zu schreiben. In diesem Fall ist der Anforderungsversand nur ein Funktionsaufruf. Dies ist bei node.js und Java-Servlet-Engines wie Apache Tomcat der Fall .
Die Wahl der Technologie liegt ganz bei Ihnen und hängt von der von Ihnen bevorzugten Programmiersprache, der für Sie verfügbaren Hosting-Umgebung, den Leistungsanforderungen, der allgemeinen Meinung und den aktuellen Trends ab. CGI zum Beispiel wurde in letzter Zeit nicht bevorzugt, da die Notwendigkeit, externe Programme zu starten, die Skalierbarkeit einschränkt.