From 6f4035aef8f123ff72ef3f9ecce81ad3e0369104 Mon Sep 17 00:00:00 2001 From: Teena Steger Date: Tue, 28 Apr 2026 13:05:20 +0200 Subject: [PATCH 1/5] 07: Demos --- web/07/demos/00_method_receiver.go | 26 ++++++++++++++ web/07/demos/01_helloworld_http.go | 18 ++++++++++ web/07/demos/02_responsewriter_http.go | 19 +++++++++++ web/07/demos/03_get_request_http.go | 36 ++++++++++++++++++++ web/07/demos/04_post_request_http.go | 47 ++++++++++++++++++++++++++ web/07/demos/05_encode_json.go | 28 +++++++++++++++ web/07/demos/06_decode_json.go | 26 ++++++++++++++ web/07/demos/post_form.html | 22 ++++++++++++ 8 files changed, 222 insertions(+) create mode 100644 web/07/demos/00_method_receiver.go create mode 100644 web/07/demos/01_helloworld_http.go create mode 100644 web/07/demos/02_responsewriter_http.go create mode 100644 web/07/demos/03_get_request_http.go create mode 100644 web/07/demos/04_post_request_http.go create mode 100644 web/07/demos/05_encode_json.go create mode 100644 web/07/demos/06_decode_json.go create mode 100644 web/07/demos/post_form.html diff --git a/web/07/demos/00_method_receiver.go b/web/07/demos/00_method_receiver.go new file mode 100644 index 0000000..00f8020 --- /dev/null +++ b/web/07/demos/00_method_receiver.go @@ -0,0 +1,26 @@ +package main + +import "fmt" + +type Person struct { + Name string + Age int +} + +// Wert-Receiver: arbeitet auf einer Kopie +func (p Person) Greet() { + fmt.Println("Hallo,", p.Name) +} + +// Zeiger-Receiver: kann das Original ändern +func (p *Person) Birthday() { + p.Age++ +} + +func main() { + a := Person{Name: "Karl", Age: 30} + + a.Greet() // Ausgabe: Hallo, Karl + a.Birthday() // Alter wird erhöht + fmt.Println(a.Age) // Ausgabe: 31 +} diff --git a/web/07/demos/01_helloworld_http.go b/web/07/demos/01_helloworld_http.go new file mode 100644 index 0000000..858f83f --- /dev/null +++ b/web/07/demos/01_helloworld_http.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "net/http" +) + +type helloHandler int + +func (hello helloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Hello World %d!", hello) +} + +func main() { + var world helloHandler + world = 42 + http.ListenAndServe("localhost:8080", world) +} diff --git a/web/07/demos/02_responsewriter_http.go b/web/07/demos/02_responsewriter_http.go new file mode 100644 index 0000000..da73765 --- /dev/null +++ b/web/07/demos/02_responsewriter_http.go @@ -0,0 +1,19 @@ +package main + +import ( + "net/http" +) + +type respExampleHandler int + +func (hello respExampleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + w.Header().Set("my-http-header", "Ein beliebiger Text") + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusFound) + w.Write([]byte("

Dies ist eine HTML-Überschrift

")) +} + +func main() { + var r respExampleHandler + http.ListenAndServe("localhost:8080", r) +} diff --git a/web/07/demos/03_get_request_http.go b/web/07/demos/03_get_request_http.go new file mode 100644 index 0000000..5462ffd --- /dev/null +++ b/web/07/demos/03_get_request_http.go @@ -0,0 +1,36 @@ +package main + +import ( + "fmt" + "net/http" +) + +type reqExampleHandler int + +func (hello reqExampleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + + if r.Method != http.MethodGet { + http.Error(w, "Only GET requests are allowed", http.StatusMethodNotAllowed) + return + } + + fmt.Println("Method:", r.Method) + fmt.Println("URL:", r.URL.String()) + fmt.Println("Host:", r.Host) + fmt.Println("Accept-Header", r.Header.Get("Accept")) + + queryParams := r.URL.Query() + fmt.Println("Query Parameters:") + for key, values := range queryParams { + for _, value := range values { + fmt.Printf(" %s = %s\n", key, value) + } + } + + w.Write([]byte("

GET: http.Request-Beispiel

")) +} + +func main() { + var r reqExampleHandler + http.ListenAndServe("localhost:8080", r) +} diff --git a/web/07/demos/04_post_request_http.go b/web/07/demos/04_post_request_http.go new file mode 100644 index 0000000..b311cf6 --- /dev/null +++ b/web/07/demos/04_post_request_http.go @@ -0,0 +1,47 @@ +package main + +import ( + "fmt" + "net/http" +) + +type formExampleHandler int + +func (formHandler formExampleHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + + if r.Method != http.MethodPost { + http.Error(w, "Only POST requests are allowed", http.StatusMethodNotAllowed) + return + } + + // Formulardaten parsen und Überprüfen, ob ungültige Formulardaten gesendet wurde + if err := r.ParseForm(); err != nil { + http.Error(w, "Fehler beim Parsen des Formulars", http.StatusBadRequest) + return + } + + // Überprüfen, ob leeres Formular gesendet wurde + if len(r.PostForm) == 0 { + http.Error(w, "Kein POST-Formular gesendet", http.StatusBadRequest) + return + } + + // Zugriff auf PostForm-Daten + // string mit Wert des Feldes "name" + name := r.PostForm.Get("name") + // []string mit allen ausgewählten Werten der Checkbox "hobby" + hobbies := r.PostForm["hobby"] + + // Ausgabe der Werte + fmt.Fprintf(w, "Name: %s\n", name) + fmt.Fprintf(w, "Hobbies:\n") + for _, h := range hobbies { + fmt.Fprintf(w, "- %s\n", h) + } + +} + +func main() { + var r formExampleHandler + http.ListenAndServe("localhost:8080", r) +} diff --git a/web/07/demos/05_encode_json.go b/web/07/demos/05_encode_json.go new file mode 100644 index 0000000..f336013 --- /dev/null +++ b/web/07/demos/05_encode_json.go @@ -0,0 +1,28 @@ +package main + +import ( + "encoding/json" + "net/http" +) + +type jsonEncodeHandler int + +type User struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Age int `json:"age"` +} + +func (jsonHandler jsonEncodeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + mariam := User{ + Firstname: "Mariam", + Lastname: "Okonkwo", + Age: 25, + } + json.NewEncoder(w).Encode(mariam) +} + +func main() { + var enc jsonEncodeHandler + http.ListenAndServe("localhost:8080", enc) +} diff --git a/web/07/demos/06_decode_json.go b/web/07/demos/06_decode_json.go new file mode 100644 index 0000000..a604cd7 --- /dev/null +++ b/web/07/demos/06_decode_json.go @@ -0,0 +1,26 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" +) + +type jsonDecodeHandler int + +type User struct { + Firstname string `json:"firstname"` + Lastname string `json:"lastname"` + Age int `json:"age"` +} + +func (jsonHandler jsonDecodeHandler) ServeHTTP(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() { + var dec jsonDecodeHandler + http.ListenAndServe("localhost:8080", dec) +} diff --git a/web/07/demos/post_form.html b/web/07/demos/post_form.html new file mode 100644 index 0000000..8ad9fa7 --- /dev/null +++ b/web/07/demos/post_form.html @@ -0,0 +1,22 @@ + + + + + + Einfaches Formular für Backend + + + +
+ + +

Hobbies: + + + +

+ +
+ + + \ No newline at end of file From 5c202be52ac4edf55122dbad3f41ad32506ded6a Mon Sep 17 00:00:00 2001 From: Teena Steger Date: Tue, 28 Apr 2026 13:06:56 +0200 Subject: [PATCH 2/5] =?UTF-8?q?06:=20L=C3=B6sungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/06/labor/06_loesungen/buecher/book.go | 48 +++++++ web/06/labor/06_loesungen/buecher/books.json | 16 +++ web/06/labor/06_loesungen/buecher/main.go | 50 ++++++++ .../06_loesungen/buecher/workshop-api.json | 119 ++++++++++++++++++ 4 files changed, 233 insertions(+) create mode 100644 web/06/labor/06_loesungen/buecher/book.go create mode 100644 web/06/labor/06_loesungen/buecher/books.json create mode 100644 web/06/labor/06_loesungen/buecher/main.go create mode 100644 web/06/labor/06_loesungen/buecher/workshop-api.json diff --git a/web/06/labor/06_loesungen/buecher/book.go b/web/06/labor/06_loesungen/buecher/book.go new file mode 100644 index 0000000..f72036b --- /dev/null +++ b/web/06/labor/06_loesungen/buecher/book.go @@ -0,0 +1,48 @@ +package main + +import ( + "encoding/json" + "os" +) + +type Book struct { + ID int `json:"id"` + Title string `json:"title"` + Author string `json:"author"` + Read bool `json:"read"` +} + +type Library struct { + Books []Book `json:"books"` +} + +func (lib *Library) Add(title, author string) { + id := len(lib.Books) + 1 + lib.Books = append(lib.Books, Book{ID: id, Title: title, Author: author, Read: false}) +} + +func (lib *Library) MarkRead(id int) { + for i := range lib.Books { + if lib.Books[i].ID == id { + lib.Books[i].Read = true + } + } +} + +func (lib *Library) Save(filename string) error { + data, err := json.MarshalIndent(lib, "", " ") + if err != nil { + return err + } + return os.WriteFile(filename, data, 0644) +} + +func LoadLibrary(filename string) (*Library, error) { + data, err := os.ReadFile(filename) + if err != nil { + return &Library{}, nil + } + var lib Library + err = json.Unmarshal(data, &lib) + return &lib, err +} diff --git a/web/06/labor/06_loesungen/buecher/books.json b/web/06/labor/06_loesungen/buecher/books.json new file mode 100644 index 0000000..882dda5 --- /dev/null +++ b/web/06/labor/06_loesungen/buecher/books.json @@ -0,0 +1,16 @@ +{ + "books": [ + { + "id": 1, + "title": "Der Steppenwolf", + "author": "Hermann Hesse", + "read": false + }, + { + "id": 2, + "title": "Clean Code", + "author": "Robert C. Martin", + "read": true + } + ] +} \ No newline at end of file diff --git a/web/06/labor/06_loesungen/buecher/main.go b/web/06/labor/06_loesungen/buecher/main.go new file mode 100644 index 0000000..b4ad205 --- /dev/null +++ b/web/06/labor/06_loesungen/buecher/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "os" + "strconv" +) + +func main() { + if len(os.Args) < 2 { + fmt.Println("Usage: add <author> | list | read <id>") + return + } + + lib, _ := LoadLibrary("books.json") + + switch os.Args[1] { + case "add": + if len(os.Args) < 4 { + fmt.Println("Usage: add <title> <author>") + return + } + lib.Add(os.Args[2], os.Args[3]) + lib.Save("books.json") + fmt.Println("Buch hinzugefügt.") + + case "list": + for _, b := range lib.Books { + status := " " + if b.Read { + status = "✓" + } + fmt.Printf("[%s] %d: \"%s\" by %s\n", status, b.ID, b.Title, b.Author) + } + + case "read": + if len(os.Args) < 3 { + fmt.Println("Geben Sie eine Buch-ID ein.") + return + } + id, err := strconv.Atoi(os.Args[2]) + if err != nil { + fmt.Println("Ungültige ID-Eingabe.") + return + } + lib.MarkRead(id) + lib.Save("books.json") + fmt.Println("Buch als gelesen markiert.") + } +} diff --git a/web/06/labor/06_loesungen/buecher/workshop-api.json b/web/06/labor/06_loesungen/buecher/workshop-api.json new file mode 100644 index 0000000..f616880 --- /dev/null +++ b/web/06/labor/06_loesungen/buecher/workshop-api.json @@ -0,0 +1,119 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Workshop API", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://localhost:8081" + } + ], + "paths": { + "/registrierung": { + "post": { + "summary": "Sends all information needed for registering at a workshop", + "requestBody": { + "required": false, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/RegistrierungForm" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistrierungForm" + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "text/plain": { + "schema": { + "type": "string", + "example": "Kein Formular gesendet" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "RegistrierungForm": { + "type": "object", + "required": [ + "vorname", + "nachname", + "agb", + "format" + ], + "properties": { + "vorname": { + "type": "string", + "example": "Zoya" + }, + "nachname": { + "type": "string", + "example": "Akhtar" + }, + "email": { + "type": "string", + "example": "z.akhtar@test.de" + }, + "telefon": { + "type": "string", + "example": "Zoya" + }, + "sessions": { + "type": "array", + "items": { + "type": "string", + "example": "vormittag" + }, + "example": [ + "vormittag", + "nachmittag" + ] + }, + "agb": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "newsletter": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "equipment": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "format": { + "type": "string", + "enum": ["online","praesenz"], + "example": "online" + } + } + } + } + } +} \ No newline at end of file From dc57083e417d70863e1c9ef7fadecdd8654f6410 Mon Sep 17 00:00:00 2001 From: Teena Steger <t.steger@hs-mannheim.de> Date: Tue, 28 Apr 2026 13:07:17 +0200 Subject: [PATCH 3/5] =?UTF-8?q?05:=20L=C3=B6sungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/05/labor/05_loesungen/uebung1.md | 8 ++ web/05/labor/05_loesungen/uebung2.md | 13 +++ web/05/labor/05_loesungen/uebung3.md | 36 ++++++++ web/05/labor/05_loesungen/uebung4.md | 60 +++++++++++++ web/05/labor/05_loesungen/uebung5.json | 112 +++++++++++++++++++++++++ 5 files changed, 229 insertions(+) create mode 100644 web/05/labor/05_loesungen/uebung1.md create mode 100644 web/05/labor/05_loesungen/uebung2.md create mode 100644 web/05/labor/05_loesungen/uebung3.md create mode 100644 web/05/labor/05_loesungen/uebung4.md create mode 100644 web/05/labor/05_loesungen/uebung5.json diff --git a/web/05/labor/05_loesungen/uebung1.md b/web/05/labor/05_loesungen/uebung1.md new file mode 100644 index 0000000..1ad0d32 --- /dev/null +++ b/web/05/labor/05_loesungen/uebung1.md @@ -0,0 +1,8 @@ +## 1. Lösung + +1.1. Antonette +1.2 10 +1.3 sunt aut facere repellat provident occaecati excepturi optio reprehenderit +1.4 5 +1.5 Ja +1.6 `curl 'https://jsonplaceholder.typicode.com/posts?userId=2` \ No newline at end of file diff --git a/web/05/labor/05_loesungen/uebung2.md b/web/05/labor/05_loesungen/uebung2.md new file mode 100644 index 0000000..e0143d0 --- /dev/null +++ b/web/05/labor/05_loesungen/uebung2.md @@ -0,0 +1,13 @@ +## 2. Lösung + +1. 68eb4a0b-6c49-44e9-aec8-5af947d22141 +```bash +curl https://hp-api.onrender.com/api/characters/staff +``` + +2. +```bash +https://hp-api.onrender.com/api/character/68eb4a0b-6c49-44e9-aec8-5af947d22141 +``` + +3. blond \ No newline at end of file diff --git a/web/05/labor/05_loesungen/uebung3.md b/web/05/labor/05_loesungen/uebung3.md new file mode 100644 index 0000000..f0e04f4 --- /dev/null +++ b/web/05/labor/05_loesungen/uebung3.md @@ -0,0 +1,36 @@ +## 3. Lösung + +#### Staudenpflanzen + +```json +[ + { + "_id": "68fa239f7037b603e8a5af57", + "name": "Lavendel", + "botanischer_name": "Lavandula angustifolia", + "standort": "Sonnig, trocken", + "besonderheiten": "Duftend, bienenfreundlich, winterhart" + }, + { + "_id": "68fa23d77037b603e8a5af59", + "name": "Funkie", + "botanischer_name": "Hosta", + "standort": "Halbschatten bis Schatten", + "besonderheiten": "Dekoratives Laub, schneckenanfällig, robust" + }, + { + "_id": "68fa23de7037b603e8a5af5a", + "name": "Sonnenhut", + "botanischer_name": "Echinacea purpurea", + "standort": "Sonnig", + "besonderheiten": "Heilpflanze, zieht Schmetterlinge, schneckenanfällig" + }, + { + "_id": "68fa23e67037b603e8a5af5b", + "name": "Tränendes Herz", + "botanischer_name": "Lamprocapnos spectabilis", + "standort": "Halbschatten", + "besonderheiten": "Herzförmige Blüten, romantisch, giftig" + } +] +``` \ No newline at end of file diff --git a/web/05/labor/05_loesungen/uebung4.md b/web/05/labor/05_loesungen/uebung4.md new file mode 100644 index 0000000..850c5af --- /dev/null +++ b/web/05/labor/05_loesungen/uebung4.md @@ -0,0 +1,60 @@ +## 4. Lösung + +1. +```json +{ + "name": "Alex", + "alter": 30, + "wohnort": "Berlin" +} +``` + +2. +```json +{ + "produktName": "Kopfhörer", + "preis": 89.99, + "verfuegbarkeit": true, + "farben": ["schwarz", "weiß"] +} + +3. +```json +{ + "benutzername": "maria1999", + "passwort": "abc123", + "rolle": "Admin", + "adresse": { + "strasse": "Bauernring 15", + "stadt": "Weilbach", + "plz": "12345" + } +} +``` + +4. +```json +[ + { + "titel": "Einkaufen gehen", + "erledigt": false + }, + { + "titel": "Rechnung bezahlen", + "erledigt": true + } +] +``` + +5. +```json +{ + "titel": "Was ist VRNnextbike?", + "autor": "VRN Redaktion", + "inhalt": "Nutzer:innen können Fahrräder per App ausleihen und zurückgeben. Die Registrierung ist kostenlos, lediglich eine Zahlungsmittel-Verifizierung ist nötig.", + "kommentar": { + "autor": "Tilla Tränenreich", + "text": "Toller Beitrag! Ich werde mich morgen selbst registrieren und es ausprobieren!" + } +} +``` \ No newline at end of file diff --git a/web/05/labor/05_loesungen/uebung5.json b/web/05/labor/05_loesungen/uebung5.json new file mode 100644 index 0000000..c9dc9b4 --- /dev/null +++ b/web/05/labor/05_loesungen/uebung5.json @@ -0,0 +1,112 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Simple Greeting API", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://localhost:8080" + } + ], + "paths": { + "/hello": { + "get": { + "summary": "Returns a greeting", + "parameters": [ + { + "name": "name", + "in": "query", + "required": true, + "description": "Name of the person to greet", + "schema": { + "type": "string" + }, + "example": "Deepak" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "Hello, Deepak!" + } + } + } + } + }, + "post": { + "summary": "Accepts a plain text name and returns a plain text greeting", + "requestBody": { + "required": true, + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "Deepika" + } + } + }, + "responses": { + "200": { + "description": "Plain text greeting response", + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "Hello, Deepika!" + } + } + } + } + } + }, + "/hello-json": { + "post": { + "summary": "Accepts a json with name and age and returns a plain text greeting", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "example": "Florian" + }, + "age": { + "type": "integer", + "example": 23 + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Plain text greeting response", + "content": { + "text/plain": { + "schema": { + "type": "string" + }, + "example": "Hello, 23-year-old Florian!" + } + } + } + } + } + } + } +} \ No newline at end of file From 2ca3dfdce96f5c32bc8a0a9e0be4e4447863748a Mon Sep 17 00:00:00 2001 From: Teena Steger <t.steger@hs-mannheim.de> Date: Tue, 28 Apr 2026 15:22:47 +0200 Subject: [PATCH 4/5] 07: Labor --- web/07/labor/07_aufgaben.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 web/07/labor/07_aufgaben.md diff --git a/web/07/labor/07_aufgaben.md b/web/07/labor/07_aufgaben.md new file mode 100644 index 0000000..a62fbc5 --- /dev/null +++ b/web/07/labor/07_aufgaben.md @@ -0,0 +1,18 @@ +# Übungsblatt 07 + +## 1. Go-Übung: Formulardaten empfangen + +**Aufgabenstellung**: Erstellen Sie ein Webserver-Programm in Go, das einen Webserver auf der Adresse `localhost:8080` startet und einen Endpunkt bereitstellt. + +- Der Endpunkt nimmt die Formulardaten der Workshop-Anmeldung aus Übungsblatt 04 entgegen und gibt sie als Response zurück. +- Nutzen Sie dazu gerne die zuvor von Ihnen in Übungsblatt 06 definierte SWAGGER-Schnittstelle (passen Sie sie ggf. an) oder diese [API-Definition](workshop-api.json). +- Es sollen nur `POST`-Request erlaubt sein. Falls eine andere Methode verwendet wurde, soll der Status-Code 405 (Method not allowed) zurückgegeben werden. +- Testen Sie Ihren Endpunkt mit Ihrem HTML-Formular oder mit diesem [Formular](workshop-anmeldung.html). + +## 2. Go-Übung: JSON-Daten empfangen + +**Aufgabenstellung**: Erweitern Sie den Endpunkt aus Aufgabe 1 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 (passen Sie sie ggf. an) oder diese [API-Definition](workshop-api.json). +- 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. From 9f95ddee80858b3a4bfa674ded7675808cbe5977 Mon Sep 17 00:00:00 2001 From: Teena Steger <t.steger@hs-mannheim.de> Date: Tue, 28 Apr 2026 15:28:37 +0200 Subject: [PATCH 5/5] 06/07: fehlende Dateien --- .../{buecher => }/workshop-api.json | 0 web/07/labor/workshop-anmeldung.html | 66 ++++++++++ web/07/labor/workshop-api.json | 119 ++++++++++++++++++ 3 files changed, 185 insertions(+) rename web/06/labor/06_loesungen/{buecher => }/workshop-api.json (100%) create mode 100644 web/07/labor/workshop-anmeldung.html create mode 100644 web/07/labor/workshop-api.json diff --git a/web/06/labor/06_loesungen/buecher/workshop-api.json b/web/06/labor/06_loesungen/workshop-api.json similarity index 100% rename from web/06/labor/06_loesungen/buecher/workshop-api.json rename to web/06/labor/06_loesungen/workshop-api.json diff --git a/web/07/labor/workshop-anmeldung.html b/web/07/labor/workshop-anmeldung.html new file mode 100644 index 0000000..a62ddde --- /dev/null +++ b/web/07/labor/workshop-anmeldung.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html lang="de"> + +<head> + <meta charset="utf-8"> + <title>Workshop-Anmeldung + + + +
+
+ Persönliche Angaben: +
+
+ +
+
+ +
+
+ +
+

+
+ +
+ Kursauswahl: +
+

+ +
+
+
+ +
+ Zusätzliche Optionen: + +
+ + +
+ + +
+
+ +
+ Teilnahmeformat: + Format wählen:
+ +
+ + +
+
+
+ +
+ + + \ No newline at end of file diff --git a/web/07/labor/workshop-api.json b/web/07/labor/workshop-api.json new file mode 100644 index 0000000..60c76d7 --- /dev/null +++ b/web/07/labor/workshop-api.json @@ -0,0 +1,119 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Workshop API", + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://localhost:8080" + } + ], + "paths": { + "/registrierung": { + "post": { + "summary": "Sends all information needed for registering at a workshop", + "requestBody": { + "required": false, + "content": { + "application/x-www-form-urlencoded": { + "schema": { + "$ref": "#/components/schemas/RegistrierungForm" + } + }, + "application/json": { + "schema": { + "$ref": "#/components/schemas/RegistrierungForm" + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "text/plain": { + "schema": { + "type": "string", + "example": "Kein Formular gesendet" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "RegistrierungForm": { + "type": "object", + "required": [ + "vorname", + "nachname", + "agb", + "format" + ], + "properties": { + "vorname": { + "type": "string", + "example": "Zoya" + }, + "nachname": { + "type": "string", + "example": "Akhtar" + }, + "email": { + "type": "string", + "example": "z.akhtar@test.de" + }, + "telefon": { + "type": "string", + "example": "Zoya" + }, + "sessions": { + "type": "array", + "items": { + "type": "string", + "example": "vormittag" + }, + "example": [ + "vormittag", + "nachmittag" + ] + }, + "agb": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "newsletter": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "equipment": { + "type": "string", + "enum": ["ja"], + "example": "ja" + }, + "format": { + "type": "string", + "enum": ["online","praesenz"], + "example": "online" + } + } + } + } + } +} \ No newline at end of file