Soll mit Go nicht nur ein Webserver entwickelt werden, der eine technische API zur Verfügung stellt, dann müssen meist auch statische Inhalte wie JavaScript-, CSS- oder Bild-Dateien ausgeliefert werden. Im Folgenden wird anhand eines Beispiels die Funktion kurz demonstriert.
Eine Einführung in die Entwicklung eines Webservers mit der Programmiersprache Go ist bereits im Artikel "Webserver mit Go" zu finden. Wie in wenigen Schritten neben dynamischen Inhalten auch statische Dateien ausgeliefert werden können ist im folgenden Beispiel zu sehen.
package main
import (
"fmt"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Willkommen")
}
func main() {
http.HandleFunc("/", index)
fs := http.FileServer(http.Dir("static/"))
http.Handle("/static/", http.StripPrefix("/static/", fs))
http.ListenAndServe(":8080", nil)
}
Mit dem Funktionsaufruf http.FileServer(http.Dir("static/"))
wird ein neuer Dateiserver erstellt und gesagt, dass im Ordner static/
nach den Dateien gesucht werden soll. Anschließend wird ein neuer Handler für den Pfad /static/
des Webservers angelegt und der Dateiserver für die Bearbeitung der Anfragen übergeben. Zu beachten ist, dass von dem Über den Webserver angefragten Pfad mit der Funktion http.StripPrefix("/static/", fs)
das führende /static
abgeschnitten wird. Würde dies nicht gemacht werden, müssten die Dateien im Ordner static/static/
abgelegt werden.
Jetzt kann der Webserver gestartet werden.
$ go run web.go
Anschließen wird auf einer zweiten Konsole der Ordner static
angelegt und die Datei test.txt
erstellt. Anschließend wird die Datei per curl
über den Webserver abgefragt.
$ mkdir static
$ echo "Test" > static/test.txt
$ curl http://localhost:8080/static/test.txt
Test
Wie zusehen ist, wurde die Datei erfolgreich abgerufen.
Fazit
Mit nur wenig zusätzlichem Aufwand liefert der Webserver jetzt auch statische Dateien aus. Dies ist für standalone Server durchaus sinnvoll. Wird ein anderer Webserver wie nginx oder Apache httpd als Proxy verwendet, lohnt es sich gegeben Falls die Dateien gleich über diesen auszuliefern.
Links
- Webseite: Go (englisch)
- Dokumentation: Go http package (englisch)
- Wikipedia: Go (Programmiersprache) (deutsch)