lab-development-imb/web/09/labor/loesungen/0102/uebung0102.go

166 lines
4.7 KiB
Go

package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"strconv"
"strings"
_ "github.com/lib/pq"
)
func insertToDB(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusNoContent)
return
}
if r.Method != http.MethodPost {
http.Error(w, "Nur POST-Methode erlaubt.", http.StatusMethodNotAllowed)
return
}
err := r.ParseForm()
if err != nil {
http.Error(w, "Fehler beim Parsen des Formulars", http.StatusBadRequest)
return
}
if len(r.PostForm) == 0 {
http.Error(w, "Kein POST-Formular gesendet", http.StatusBadRequest)
return
}
name := r.PostForm.Get("name")
hobbies := r.PostForm["hobby"]
// Umwandlung in einen String mit Komma-Trennung
hobbiesAsString := strings.Join(hobbies, ", ")
alter, err := strconv.Atoi(r.PostForm.Get("alter"))
if err != nil {
log.Println("Parameter konnte nicht korrekt verarbeitet werden:", err)
http.Error(w, "Benutzereingabe fehlerhaft.", http.StatusBadRequest)
return
}
// Verbindungszeichenfolge: Benutzername, Passwort, DB-Name, Host, Port
connStr := "user=devuser password=devpass dbname=devdb host=localhost port=5432 sslmode=disable"
// Verbindung zur Datenbank öffnen
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Println("Fehler beim Öffnen der Verbindung:", err)
http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError)
return
}
defer db.Close()
// Verbindung testen
err = db.Ping()
if err != nil {
log.Println("Datenbank nicht erreichbar:", err)
http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError)
return
}
log.Println("Verbindung erfolgreich hergestellt.")
// INSERT-Anweisung vorbereiten
query := `INSERT INTO personen (name, hobbies, alter) VALUES ($1, $2, $3)`
// INSERT-Anweisung ausführen
_, err = db.Exec(query, name, hobbiesAsString, alter)
if err != nil {
log.Println("Fehler beim Einfügen:", err)
http.Error(w, "Datensatz konnte nicht gespeichert werden.", http.StatusInternalServerError)
return
}
log.Println("Datensatz erfolgreich eingefügt.")
fmt.Fprintln(w, "Ihre Hobbies wurden erfolgreich gespeichert.")
}
func updateInDB(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusNoContent)
return
}
if r.Method != http.MethodPost {
http.Error(w, "Nur POST-Methode erlaubt.", http.StatusMethodNotAllowed)
return
}
err := r.ParseForm()
if err != nil {
http.Error(w, "Fehler beim Parsen des Formulars", http.StatusBadRequest)
return
}
if len(r.PostForm) == 0 {
http.Error(w, "Kein POST-Formular gesendet", http.StatusBadRequest)
return
}
name := r.PostForm.Get("name")
hobbies := r.PostForm["hobby"]
// Umwandlung in einen String mit Komma-Trennung
hobbiesAsString := strings.Join(hobbies, ", ")
alter, err := strconv.Atoi(r.PostForm.Get("alter"))
if err != nil {
log.Println("Parameter konnte nicht korrekt verarbeitet werden:", err)
http.Error(w, "Benutzereingabe fehlerhaft.", http.StatusBadRequest)
return
}
// Verbindungszeichenfolge: Benutzername, Passwort, DB-Name, Host, Port
connStr := "user=devuser password=devpass dbname=devdb host=localhost port=5432 sslmode=disable"
// Verbindung zur Datenbank öffnen
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Println("Fehler beim Öffnen der Verbindung:", err)
http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError)
return
}
defer db.Close()
// Verbindung testen
err = db.Ping()
if err != nil {
log.Println("Datenbank nicht erreichbar:", err)
http.Error(w, "Interner Server-Fehler.", http.StatusInternalServerError)
return
}
log.Println("Verbindung erfolgreich hergestellt.")
// UPDATE-Anweisung vorbereiten
query := `UPDATE personen SET hobbies = $1, alter = $2 WHERE name = $3`
// UPDATE-Anweisung ausführen
_, err = db.Exec(query, hobbiesAsString, alter, name)
if err != nil {
log.Println("Fehler beim Aktualisieren:", err)
http.Error(w, "Datensatz konnte nicht aktualisiert werden.", http.StatusInternalServerError)
return
}
log.Println("Datensatz erfolgreich aktualisiert.")
fmt.Fprintln(w, "Ihre Hobbies wurden erfolgreich aktualisiert.")
}
func main() {
http.HandleFunc("/insert", insertToDB)
http.HandleFunc("/update", updateInDB)
fmt.Println("Server läuft auf localhost:8080...")
log.Fatal(http.ListenAndServe(":8080", nil))
}