Menu
Coddy logo textTech

Powtórzenie – modele REST API

Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 78 z 107.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system modeli REST API dla platformy blogowej! Utworzysz dobrze ustrukturyzowane typy, które serializują się do JSON i zapewniają czytelne reprezentacje tekstowe — dokładnie to, czego potrzebujesz podczas tworzenia rzeczywistych odpowiedzi API.

Uporządkujesz kod w dwóch plikach:

  • models.go: Zdefiniuj modele danych API z odpowiednimi tagami JSON i reprezentacjami tekstowymi.

    Utwórz strukturę Author z polami ID (int), Name (string) i Email (string). Przypisz im klucze JSON "id", "name" i "email". Zaimplementuj String(), aby zwracała format [Name] <[Email]>.

    Utwórz strukturę Post z polami ID (int), Title (string), Content (string), Author (zagnieżdżona struktura Author) i Published (bool). Przypisz im klucze "id", "title", "content", "author" i "published". Pole Content powinno używać omitempty, aby pusta treść nie pojawiała się w JSON. Zaimplementuj String(), aby zwracała "[Title]" by [Author's String representation].

    Utwórz strukturę APIResponse z polami Success (bool), Message (string) i Data (Post). Przypisz im klucze "success", "message" i "data". Pole Message powinno używać omitempty.

  • main.go: Twórz odpowiedzi API i pokaż zarówno wynik JSON, jak i reprezentacje tekstowe.

    Wczytaj typ operacji (json lub display), a następnie szczegóły wpisu: ID wpisu, tytuł, treść, ID autora, imię i nazwisko autora, adres e-mail autora oraz status publikacji (true lub false).

    Dla json: Utwórz APIResponse z Success: true i wpisem Post jako danymi (pozostaw Message pusty). Przekonwertuj na JSON i wypisz wynik.

    Dla display: Utwórz Post i wypisz go za pomocą jego metody String, a następnie wypisz Author osobno, w nowym wierszu.

Zostaną podane następujące dane wejściowe:

  • Wiersz 1: Typ operacji (json lub display)
  • Wiersz 2: ID wpisu
  • Wiersz 3: Tytuł
  • Wiersz 4: Treść (może być pusta)
  • Wiersz 5: ID autora
  • Wiersz 6: Imię i nazwisko autora
  • Wiersz 7: Adres e-mail autora
  • Wiersz 8: Status publikacji (true lub false)

Na przykład, dla danych:

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

Wynik powinien być następujący:

{"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}}

A dla danych:

json
2
Draft Post

102
John Doe
john@example.com
false

Wynik powinien być następujący:

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

Zwróć uwagę, że puste pole treści jest pomijane w wyniku JSON.

A dla danych:

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

Wynik powinien być następujący:

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

Spróbuj swoich sił

package main

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

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

	// Odczytaj typ operacji
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// Odczytaj identyfikator posta
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// Odczytaj tytuł
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// Odczytaj treść
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// Odczytaj identyfikator autora
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// Odczytaj imię i nazwisko autora
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// Odczytaj adres e-mail autora
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// Odczytaj status publikacji
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: Utwórz strukturę Author z odczytanymi wartościami

	// TODO: Utwórz strukturę Post z odczytanymi wartościami i strukturą Author

	// TODO: Obsłuż typ operacji
	// Jeśli operation ma wartość "json":
	//   - Utwórz APIResponse z Success: true i Post jako Data
	//   - Przekształć na JSON za pomocą json.Marshal
	//   - Wypisz ciąg JSON
	// Jeśli operation ma wartość "display":
	//   - Wypisz Post za pomocą jego metody String
	//   - Wypisz Author w nowym wierszu

	// Kod zastępczy wykorzystujący zmienne (usuń podczas implementacji)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Go online