Menu
Coddy logo textTech

Ripasso - modelli REST API

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 78 di 107.

challenge icon

Sfida

Facile

Costruiamo un sistema di modelli per un'API REST per una piattaforma di blog! Creerai tipi ben strutturati che si serializzano in JSON e forniscono rappresentazioni testuali leggibili, proprio quello che ti serve quando crei vere risposte API.

Organizzerai il codice in due file:

  • models.go: Definisci i modelli dei dati dell'API con tag JSON appropriati e rappresentazioni testuali.

    Crea una struct Author con i campi ID (int), Name (string) e Email (string). Mappali alle chiavi JSON "id", "name" e "email". Implementa String() in modo che restituisca il formato [Name] <[Email]>.

    Crea una struct Post con ID (int), Title (string), Content (string), Author (struct Author annidata) e Published (bool). Mappali a "id", "title", "content", "author" e "published". Il campo Content deve usare omitempty, in modo che i contenuti vuoti non appaiano nel JSON. Implementa String() in modo che restituisca "[Title]" by [Author's String representation].

    Crea una struct APIResponse con Success (bool), Message (string) e Data (Post). Mappali a "success", "message" e "data". Il campo Message deve usare omitempty.

  • main.go: Crea risposte API e mostra sia l'output JSON sia le rappresentazioni testuali.

    Leggi un tipo di operazione (json o display), poi leggi i dettagli del post: ID del post, titolo, contenuto, ID dell'autore, nome dell'autore, email dell'autore e stato di pubblicazione (true o false).

    Per json: Crea un APIResponse con Success: true e il Post come dato (lascia Message vuoto). Converti in JSON e stampalo.

    Per display: Crea il Post e stampalo usando il suo metodo String, poi stampa l'Author separatamente su una nuova riga.

Verranno forniti i seguenti input:

  • Riga 1: Tipo di operazione (json o display)
  • Riga 2: ID del post
  • Riga 3: Titolo
  • Riga 4: Contenuto (può essere vuoto)
  • Riga 5: ID dell'autore
  • Riga 6: Nome dell'autore
  • Riga 7: Email dell'autore
  • Riga 8: Stato di pubblicazione (true o false)

Per esempio, dato:

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

Il tuo output dovrebbe essere:

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

E dato:

json
2
Draft Post

102
John Doe
john@example.com
false

Il tuo output dovrebbe essere:

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

Nota come il campo del contenuto vuoto viene omesso dall'output JSON.

E dato:

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

Il tuo output dovrebbe essere:

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

Provalo tu

package main

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

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

	// Leggi il tipo di operazione
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// Leggi l'ID del post
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// Leggi il titolo
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// Leggi il contenuto
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// Leggi l'ID dell'autore
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// Leggi il nome dell'autore
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// Leggi l'email dell'autore
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// Leggi lo stato di pubblicazione
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: Crea una struct Author con i valori letti

	// TODO: Crea una struct Post con i valori letti e l'Author

	// TODO: Gestisci il tipo di operazione
	// Se operation è "json":
	//   - Crea una APIResponse con Success: true e il Post come Data
	//   - Converti in JSON usando json.Marshal
	//   - Stampa la stringa JSON
	// Se operation è "display":
	//   - Stampa il Post usando il suo metodo String
	//   - Stampa l'Author su una nuova riga

	// Segnaposto per usare le variabili (rimuovere durante l'implementazione)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online