Prinzip einer Web-Applikation
- Grundlage ist das Hypertext Transfer Protokoll HTTP
- Client sendet einen HTTP Request
- Server verarbeitet den Request
- Server antwortet mit HTTP Response
- Das Format des Request wird oft von einer Web-Applikation mit Hyperlinks auf einer Webseite vorgegeben
HTTP Kommunikation zwischen Web Client und Web Server
Zwei einfache Beispiele
Das Hello Web Beispiel
- Kern der Go Web Applikationen sind Handler Objekte bzw. Handler Funktionen.
- Sie erhalten einen Zeiger auf den HTTP Request (*http.Request) und erzeugen den HTTP Response, indem sie Ausgaben auf den http.ReponseWriter schreiben.
- Die Handler-Funktion hat Zugriff auf alle Elemente des HTTP Requests.
- Zu allererst wird der eingehende HTTP Request an einen sogenannten Multiplexer geleitet. Er bestimmt aus der URL, welcher Handler den Request bearbeiten soll.
- http.ListenAndServe startet den Server auf dem angegebenen Port. Der Parameter nil bewirkt, dass der DefaultServeMux aus der Go Standardbibliothek verwendet wird.
- http.HandleFunc registriert die Handler-Funktion hello beim DefaultServeMux Multiplexer für den relativen Pfad „/“.
- Die einfachste Web-App schreibt einfach einen String in den ResponseWriter.
package main import ( "fmt" "net/http" ) func hello(writer http.ResponseWriter, request *http.Request) { fmt.Fprintf(writer, "Hello from Go, %s!", request.URL.Path[1:]) } func main() { http.HandleFunc("/", hello) http.ListenAndServe("0.0.0.0:8080", nil) }
Go Webserver kann statische Seiten bereitstellen
- Eine Webapp enthält meist statische Inhalte → Dateien
- statische HTML-Seiten, Grafiken, Fonts, css Styles, Downloads, JavaScript, Flash, …
- Dazu muss der absolute Pfad dieser Dateien bekannt sein
- In produktiven Applikationen ein spezielles Verzeichnis, im Beispiel ein Verzeichnis im Quellcode-Baum (…/pub)
- http.FileServer aus der Standardbibliothek macht Dateien zugreifbar
- http.FileServer ist ein spezialisierter Handler
// hole einen DefaultServeMux mux := http.NewServeMux() // finde Working directory = GOPATH pwd, _ := os.Getwd() // und hänge den ganzen Pfad zu den statischen Files dahinter dir := http.Dir(pwd + "/src/github.com/geobe/go4web/webmain1/pub") files := http.FileServer(dir) // unter der URL /static/ werden files bereitgestellt, // Präfix /static/ wird abgeschnitten mux.Handle("/static/", http.StripPrefix("/static/", files))