08: Demos und Labor

main
Teena Steger 2025-11-19 10:06:03 +01:00
parent 5095ea3c58
commit fe471c385d
11 changed files with 295 additions and 0 deletions

View File

@ -0,0 +1,26 @@
package main
import (
"fmt"
"net/http"
)
type appleHandler int
type bananaHandler string
func (a appleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Apple 🍎")
}
func (b bananaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Banana 🍌")
}
func main() {
var a appleHandler
var b bananaHandler
mux := http.NewServeMux()
mux.Handle("/apple", a)
mux.Handle("/banana", b)
http.ListenAndServe("localhost:8080", mux)
}

View File

@ -0,0 +1,25 @@
package main
import (
"fmt"
"net/http"
)
type appleDefaultHandler int
type bananaDefaultHandler string
func (a appleDefaultHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Apple")
}
func (b bananaDefaultHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Banana")
}
func main() {
var a appleDefaultHandler
var b bananaDefaultHandler
http.Handle("/apple", a)
http.Handle("/banana", b)
http.ListenAndServe("localhost:8080", nil)
}

View File

@ -0,0 +1,20 @@
package main
import (
"fmt"
"net/http"
)
func appleFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "🍎 Apple func antwortet")
}
func bananaFunc(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "🍌 Banana func antwortet")
}
func main() {
http.HandleFunc("/apple", appleFunc)
http.HandleFunc("/banana", bananaFunc)
http.ListenAndServe("localhost:8080", nil)
}

View File

@ -0,0 +1,35 @@
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type User struct {
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
Age int `json:"age"`
}
func encode(w http.ResponseWriter, r *http.Request) {
mariam := User{
Firstname: "Mariam",
Lastname: "Okonkwo",
Age: 25,
}
json.NewEncoder(w).Encode(mariam)
}
func decode(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)
fmt.Fprintf(w, "%s %s is %d years old!", user.Firstname, user.Lastname, user.Age)
}
func main() {
http.HandleFunc("/encode", encode)
http.HandleFunc("/decode", decode)
http.ListenAndServe("localhost:8080", nil)
}

View File

@ -0,0 +1,48 @@
package main
import (
"fmt"
"net/http"
)
func start(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "<a href=\"/set\">Setze Cookie</a>")
fmt.Fprintln(w, "<a href=\"/get\">Zeige Cookie</a>")
fmt.Fprintln(w, "<a href=\"/get\">Lösche Cookie</a>")
}
func setCookie(w http.ResponseWriter, r *http.Request) {
c := &http.Cookie{Name: "lang", Value: "de"}
http.SetCookie(w, c)
fmt.Fprintln(w, "<p>Cookie gesetzt. Überprüfe in Dev-Tools oder <a href=\"/get\">hier anzeigen</a> oder <a href=\"/clear\">hier löschen</a></p>")
}
func getCookie(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("lang")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
fmt.Fprintln(w, "Cookie: lang = ", c.Value)
}
func clearCookie(w http.ResponseWriter, r *http.Request) {
c, err := r.Cookie("lang")
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
c.MaxAge = -1
http.SetCookie(w, c)
fmt.Fprintln(w, "Cookie gelöscht: lang")
}
func main() {
http.HandleFunc("/", start)
http.HandleFunc("/set", setCookie)
http.HandleFunc("/get", getCookie)
http.HandleFunc("/clear", clearCookie)
fmt.Println("Server läuft auf http://localhost:8080")
http.ListenAndServe(":8080", nil)
}

View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bücher-Merkliste</title>
</head>
<body>
<h1>Eigenen Merkzettel anlegen</h1>
<form action="http://localhost:8080/add" method="GET">
<label for="buchname">Titel des Buchs:</label>
<input type="text" id="buchname" name="book">
<button type="submit">Merken</button>
</form>
<br>
<a href="http://localhost:8080/list">Gehe zu Merkzettel</a>
</body>
</html>

View File

@ -0,0 +1,64 @@
package main
import (
"fmt"
"net/http"
"sync"
"github.com/google/uuid"
)
// Session-Speicher (Map von SessionID -> Merkzettel)
var (
sessions = make(map[string][]string)
mu sync.Mutex
)
// Hilfsfunktion: Session-ID aus Cookie holen oder neue erstellen
func getSessionID(w http.ResponseWriter, r *http.Request) string {
cookie, err := r.Cookie("session_id")
if err != nil {
// Neue Session-ID erzeugen (UUID)
newID := uuid.New().String()
http.SetCookie(w, &http.Cookie{
Name: "session_id",
Value: newID,
})
mu.Lock()
sessions[newID] = []string{} // leeren Merkzettel anlegen
mu.Unlock()
return newID
}
return cookie.Value
}
// Buch zum Merkzettel hinzufügen
func addToMerkzettel(w http.ResponseWriter, r *http.Request) {
sessionID := getSessionID(w, r)
book := r.URL.Query().Get("book")
if book == "" {
fmt.Fprintln(w, "Bitte Buchtitel angeben: ?book=XYZ")
return
}
mu.Lock()
sessions[sessionID] = append(sessions[sessionID], book)
mu.Unlock()
fmt.Fprintf(w, "Buch '%s' zum Merkzettel hinzugefügt!\n", book)
}
// Merkzettel anzeigen
func showMerkzettel(w http.ResponseWriter, r *http.Request) {
sessionID := getSessionID(w, r)
mu.Lock()
books := sessions[sessionID]
mu.Unlock()
fmt.Fprintf(w, "Dein Merkzettel: %v\n", books)
}
func main() {
http.HandleFunc("/add", addToMerkzettel)
http.HandleFunc("/list", showMerkzettel)
fmt.Println("Server läuft auf http://localhost:8080")
http.ListenAndServe(":8080", nil)
}

View File

@ -0,0 +1,5 @@
module demo/session
go 1.24.5
require github.com/google/uuid v1.6.0

View File

@ -0,0 +1,2 @@
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=

View File

@ -0,0 +1,23 @@
# Übungsblatt 08
## 1. Go-Übung: Routing
**Aufgabenstellung**: Erstellen Sie ein einfaches Webserver-Programm in Go, das zwei HTTP-Endpunkte `/login` und `/logout` bereitstellt. Beim Aufruf dieser Pfade soll jeweils eine passende Textnachricht im Browser erscheinen. Verwenden Sie dazu die Standardbibliothek `net/http` und definieren Sie eigene Funktionen zur Übergabe an `HandleFunc`.
## 2. Go-Übung: JSON-Daten empfangen
**Aufgabenstellung**: Erweitern Sie den Endpunkt aus Übungsblatt 07 Aufgabe 3 so, dass auch JSON-Daten empfangen und ausgegeben werden können.
- Nutzen Sie dazu gerne die zuvor von Ihnen in Übungsblatt 06 definierte SWAGGER-Schnittstelle.
- Falls die JSON-Daten fehlerhaft sind, soll der Status-Code 400 (Bad Request) zurückgegeben werden.
- Testen Sie Ihren Endpunkt mit `curl`-Befehlen oder wahlweise mit Postman oder SWAGGER.
## 3. Go-Übung: Cookies
**Aufgabenstellung**: Erstellen Sie ein einfaches Webserver-Programm in Go, das drei HTTP-Endpunkte `/create-cookie`, `/show-cookie` und `/delete-cookie` bereitstellt. Beim Aufruf dieser Pfade soll entweder ein neuer Cookie mit dem Namen `keks` und einer generierten UUID als Wert erstellt, der Wert im Browser ausgegeben oder der Cookie ganz gelöscht werden. Außerdem soll jeweils eine passende Textnachricht im Browser erscheinen.
#### Hinweis
Um externe Bibliotheken (z.B. `github.com/google/uuid` zur Erstellung von UUIDs) verwenden zu können, müssen Sie zunächst ein Modul definieren und die Abhängigkeiten darüber verwalten. Eine kurze Anleitung dazu finden Sie hier: [Abhängigkeiten mit go.mod](anleitung_extlib.md)

View File

@ -0,0 +1,26 @@
# Abhängigkeitsverwaltung mit `go.mod`
## Hintergrund
Externe Pakete, die im Code importiert werden, werden über eine `go.mod`Datei verwaltet. Diese Datei definiert das Modul und listet alle Abhängigkeiten auf. Sie gehört fest zum Projekt und wird im QuellcodeRepository mitgeführt.
## Anweisungen
Annahme: Go-Programm ist bereits vorhanden und die Imports im Code sind gesetzt. Außerdem befinden Sie sich in dem Ordner mit dem Go-Programm.
1. **Modul initialisieren (falls noch nicht geschehen)**
```bash
go mod init example.com/myapp
```
Der Modulpfad entspricht in der Praxis meist der RepositoryAdresse, z.B. `github.com/mymodule`. Für einfache Beispiele genügt ein Platzhalter wie `example.com/myapp`
2. **Abhängigkeiten auflösen und aufräumen**
```bash
go mod tidy
```
Dadurch werden alle im Code verwendeten Imports heruntergeladen und ins `go.mod` eingetragen. Nicht mehr benötigte Pakete werden entfernt.
3. **Programm starten**
```bash
go run .
```