Menu
CoddyTech

Rückblick – REST-API-Modelle

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 78 von 107.

challenge icon

Aufgabe

Einfach

Erstellen wir ein REST-API-Modellsystem für eine Blogplattform! Du erstellst gut strukturierte Typen, die zu JSON serialisiert werden und lesbare Zeichenfolgendarstellungen bereitstellen – genau das, was du beim Erstellen echter API-Antworten brauchst.

Du verteilst deinen Code auf zwei Dateien:

  • models.go: Definiere deine API-Datenmodelle mit passenden JSON-Tags und Zeichenfolgendarstellungen.

    Erstelle ein Author-Struct mit den Feldern ID (int), Name (string) und Email (string). Ordne ihnen die JSON-Schlüssel "id", "name" und "email" zu. Implementiere String(), sodass das Format [Name] <[Email]> zurückgegeben wird.

    Erstelle ein Post-Struct mit ID (int), Title (string), Content (string), Author (verschachteltes Author-Struct) und Published (bool). Ordne ihnen "id", "title", "content", "author" und "published" zu. Für das Feld Content sollte omitempty verwendet werden, damit leere Inhalte nicht in JSON erscheinen. Implementiere String(), sodass "[Title]" by [Author's String representation] zurückgegeben wird.

    Erstelle ein APIResponse-Struct mit Success (bool), Message (string) und Data (Post). Ordne ihnen "success", "message" und "data" zu. Für das Feld Message sollte omitempty verwendet werden.

  • main.go: Erstelle API-Antworten und zeige sowohl die JSON-Ausgabe als auch die Zeichenfolgendarstellungen.

    Lies zuerst einen Vorgangstyp (json oder display) und dann die Beitragsdetails ein: Beitrags-ID, Titel, Inhalt, Autor-ID, Autorenname, E-Mail-Adresse des Autors und Veröffentlichungsstatus (true oder false).

    Für json: Erstelle eine APIResponse mit Success: true und dem Post als Daten (lasse Message leer). Wandle sie in JSON um und gib sie aus.

    Für display: Erstelle den Post und gib ihn mit seiner String-Methode aus. Gib anschließend den Author separat in einer neuen Zeile aus.

Die folgenden Eingaben werden bereitgestellt:

  • Zeile 1: Vorgangstyp (json oder display)
  • Zeile 2: Post-ID
  • Zeile 3: Titel
  • Zeile 4: Inhalt (kann leer sein)
  • Zeile 5: Author-ID
  • Zeile 6: Name des Autors
  • Zeile 7: E-Mail-Adresse des Autors
  • Zeile 8: Veröffentlichungsstatus (true oder false)

Zum Beispiel bei folgender Eingabe:

json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
true

Deine Ausgabe sollte sein:

{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}

Und bei folgender Eingabe:

json
2
Draft Post

102
John Doe
john@example.com
false

Deine Ausgabe sollte sein:

{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}

Beachte, dass das leere Feld für den Inhalt in der JSON-Ausgabe ausgelassen wird.

Und bei folgender Eingabe:

display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
true

Deine Ausgabe sollte sein:

"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>

Probier es selbst

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Operationstyp einlesen
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// Post-ID einlesen
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// Titel einlesen
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// Inhalt einlesen
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// Autor-ID einlesen
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// Autorennamen einlesen
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// E-Mail-Adresse des Autors einlesen
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// Veröffentlichungsstatus einlesen
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: Ein Author-Struct mit den eingelesenen Werten erstellen

	// TODO: Ein Post-Struct mit den eingelesenen Werten und dem Author erstellen

	// TODO: Den Operationstyp verarbeiten
	// Wenn operation "json" ist:
	//   - Erstelle eine APIResponse mit Success: true und dem Post als Data
	//   - Konvertiere mit json.Marshal in JSON
	//   - Gib die JSON-Zeichenfolge aus
	// Wenn operation "display" ist:
	//   - Gib den Post mit seiner String-Methode aus
	//   - Gib den Author in einer neuen Zeile aus

	// Platzhalter zur Verwendung der Variablen (bei der Implementierung entfernen)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler