Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| schulung:statischer_http_server [2021/12/06 22:14] – Thomas | schulung:statischer_http_server [2022/01/11 16:28] (aktuell) – index.html Thomas | ||
|---|---|---|---|
| Zeile 10: | Zeile 10: | ||
| # Allgemeine Defiitionen: | # Allgemeine Defiitionen: | ||
| SERVER_HOST = ' | SERVER_HOST = ' | ||
| - | SERVER_PORT = 8000 # nur im Beispiel, per Konvention geht http über Port 80 | + | SERVER_PORT = 8000 # nur im Beispiel, |
| + | # | ||
| # Wir binden uns an einen Socket | # Wir binden uns an einen Socket | ||
| Zeile 26: | Zeile 27: | ||
| # da hat einer angebissen, jetzt die Daten des Requests: | # da hat einer angebissen, jetzt die Daten des Requests: | ||
| - | request = client_connection.recv(1024).decode() | + | request = client_connection.recv(1024).decode(" |
| print(request) | print(request) | ||
| # Und unser HTTP Response dazu: | # Und unser HTTP Response dazu: | ||
| response = ' | response = ' | ||
| - | client_connection.sendall(response.encode()) | + | |
| + | # \n ist das Sonderzeichen für Zeilenende | ||
| + | # | ||
| + | | ||
| client_connection.close() | client_connection.close() | ||
| Zeile 38: | Zeile 42: | ||
| </ | </ | ||
| - | Das ist der allereinfachste statische Webserver. Es wird immer (egal welche Ressource angefordert wurde) Das (Pseudo-)Dokument "Hallo Welt" zurückgeliefert. | + | Das ist der allereinfachste statische Webserver. Es wird immer (egal welche Ressource angefordert wurde) Das (Pseudo-)Dokument "**Hallo Welt**" zurückgeliefert. |
| - | Den Kommunikationsablauf schauen wir uns trotzdem mal in der [[https:// | + | Den Kommunikationsablauf schauen wir uns trotzdem mal in der [[https:// |
| Server starten mit | Server starten mit | ||
| Zeile 62: | Zeile 66: | ||
| Ein korrekter Web-Server würde die Request-Zeile ("GET /...") auf den geforderten Aufbau hin überprüfen und interpretieren. | Ein korrekter Web-Server würde die Request-Zeile ("GET /...") auf den geforderten Aufbau hin überprüfen und interpretieren. | ||
| - | Die eigentliche Aufgabe besteht aber darin, je nach Request-Kommando und der angefragt | + | Die eigentliche Aufgabe besteht aber darin, je nach Request-Kommando und der angefragten |
| Wir nehmen hier immer die einfachste Form des Request, das GET. Der Vollständigkeit halber ein paar Worte zu den anderen Request-Typen: | Wir nehmen hier immer die einfachste Form des Request, das GET. Der Vollständigkeit halber ein paar Worte zu den anderen Request-Typen: | ||
| Zeile 68: | Zeile 72: | ||
| * **HEAD**: Spezialform des GET, es soll kein Inhalt übertragen werden. Der Browser will hier nur nachschauen, | * **HEAD**: Spezialform des GET, es soll kein Inhalt übertragen werden. Der Browser will hier nur nachschauen, | ||
| * **POST**: Das ist die Form eines Requests, wenn der Browser dem Server auch noch Daten schicken will. Die können aus Formulareingabefeldern aus der Webseite stammen oder beispielsweise ein Datei zum Hochladen sein. Offensichtlich hat der Server dann etwas mehr zu tun. Die Daten werden auch hier nach der Leerzeile hinter der Requestzeile angehängt. Details dazu spare ich mir hier. | * **POST**: Das ist die Form eines Requests, wenn der Browser dem Server auch noch Daten schicken will. Die können aus Formulareingabefeldern aus der Webseite stammen oder beispielsweise ein Datei zum Hochladen sein. Offensichtlich hat der Server dann etwas mehr zu tun. Die Daten werden auch hier nach der Leerzeile hinter der Requestzeile angehängt. Details dazu spare ich mir hier. | ||
| - | * In späteren HTTP-Versionen kommen weitere | + | * In späteren HTTP-Versionen kommen weitere |
| + | Zu Übungszwecken ersetzen wir den etwas zu einfachen HTTP Server von eben mit dem nächst einfachen Modell, das jede Ressource in der URL als Dateinamen im aktuellen Verzeichnis interpretiert: | ||
| + | < | ||
| + | cd ~/ | ||
| + | echo "Dies ist ein Test." > test.txt | ||
| + | python3 -m http.server 8000 | ||
| + | </ | ||
| + | |||
| + | und auf der //Client// Seite verwenden wir jetzt auch mal ein etwas leistungsstärkeres Erprobungstool: | ||
| + | |||
| + | < | ||
| + | curl -v http:// | ||
| + | </ | ||
| + | |||
| + | Das Ergebnis sieht dann in Summe etwa so aus: | ||
| + | {{: | ||
| + | |||
| + | Aber schon wenn man ein echtes (wenn auch recht einfaches) HTML Dokument auf diesem Weg anzeigen will, dann sieht man nicht viel. Beispiel für so eine Datei: | ||
| + | |||
| + | <code html> | ||
| + | < | ||
| + | |||
| + | <html lang=de> | ||
| + | |||
| + | < | ||
| + | <meta charset=utf-8> | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | <img src=" | ||
| + | |||
| + | |||
| + | <li> <a href=" | ||
| + | <li> <a href=" | ||
| + | |||
| + | </ | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | Deshalb schauen wir uns das Ergebnis lieber in einem richtigen Browser an. | ||
| + | Im wirklichen Leben macht sich außerdem ein [[Schulung: | ||