Menu
CoddyTech

Repaso - Modelos de REST API

Parte de la sección Programación Orientada a Objetos del Journey de GO de Coddy. Lección 78 de 107.

challenge icon

Desafío

Fácil

¡Vamos a crear un sistema de modelos para una API REST de una plataforma de blogs! Crearás tipos bien estructurados que se serializan a JSON y ofrecen representaciones de cadena legibles, justo lo que necesitarías al crear respuestas reales de una API.

Organizarás el código en dos archivos:

  • models.go: Define tus modelos de datos de la API con etiquetas JSON adecuadas y representaciones de cadena.

    Crea una estructura Author con los campos ID (int), Name (string) y Email (string). Asígnales las claves JSON "id", "name" y "email". Implementa String() para que devuelva el formato [Name] <[Email]>.

    Crea una estructura Post con ID (int), Title (string), Content (string), Author (una estructura Author anidada) y Published (bool). Asígnales "id", "title", "content", "author" y "published". El campo Content debe usar omitempty para que el contenido vacío no aparezca en JSON. Implementa String() para que devuelva "[Title]" by [Author's String representation].

    Crea una estructura APIResponse con Success (bool), Message (string) y Data (Post). Asígnales "success", "message" y "data". El campo Message debe usar omitempty.

  • main.go: Crea respuestas de la API y muestra tanto la salida JSON como las representaciones de cadena.

    Lee un tipo de operación (json o display) y, después, lee los detalles de la publicación: ID de la publicación, título, contenido, ID del autor, nombre del autor, correo electrónico del autor y estado de publicación (true o false).

    Para json: Crea un APIResponse con Success: true y la publicación como datos (deja Message vacío). Convierte la respuesta a JSON e imprímela.

    Para display: Crea la publicación e imprímela usando su método String; después, imprime el autor por separado en una línea nueva.

Se proporcionarán las siguientes entradas:

  • Línea 1: Tipo de operación (json o display)
  • Línea 2: ID de la publicación
  • Línea 3: Título
  • Línea 4: Contenido (puede estar vacío)
  • Línea 5: ID del autor
  • Línea 6: Nombre del autor
  • Línea 7: Correo electrónico del autor
  • Línea 8: Estado de publicación (true o false)

Por ejemplo, dada la siguiente entrada:

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

La salida debería ser:

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

Y dada la siguiente entrada:

json
2
Draft Post

102
John Doe
john@example.com
false

La salida debería ser:

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

Observa que el campo de contenido vacío se omite en la salida JSON.

Y dada la siguiente entrada:

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

La salida debería ser:

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

Pruébalo tú mismo

package main

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

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

	// Leer el tipo de operación
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// Leer el ID de la publicación
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// Leer el título
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// Leer el contenido
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// Leer el ID del autor
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// Leer el nombre del autor
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// Leer el correo electrónico del autor
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// Leer el estado de publicación
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: Crear una estructura Author con los valores leídos

	// TODO: Crear una estructura Post con los valores leídos y el Author

	// TODO: Gestionar el tipo de operación
	// Si operation es "json":
	//   - Crea un APIResponse con Success: true y el Post como Data
	//   - Convierte a JSON usando json.Marshal
	//   - Imprime la cadena JSON
	// Si operation es "display":
	//   - Imprime el Post usando su método String
	//   - Imprime el Author en una línea nueva

	// Código provisional para usar las variables (elimínalo al implementar)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Go online