Menu
Coddy logo textTech

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

¡Construyamos un sistema de modelos de API REST para una plataforma de blog! Crearás tipos bien estructurados que se serialicen a JSON y proporcionen representaciones de cadena legibles, exactamente lo que necesitarías al crear respuestas de API reales.

Organizarás tu código en dos archivos:

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

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

    Crea una estructura Post con los campos ID (int), Title (string), Content (string), Author (estructura Author anidada) y Published (bool). Asígnalos a "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 los campos Success (bool), Message (string) y Data (Post). Asígnalos a "success", "message" y "data". El campo Message debe usar omitempty.

  • main.go: Crea respuestas de 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 Post como datos (deja Message vacío). Convierte la respuesta a JSON e imprímela.

    Para display: crea la Post e imprímela usando su método String; después imprime el Author por separado en una nueva línea.

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, dadas estas entradas:

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

Tu 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 dadas estas entradas:

json
2
Draft Post

102
John Doe
john@example.com
false

Tu 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 cómo el campo de contenido vacío se omite de la salida JSON.

Y dadas estas entradas:

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

Tu salida debería ser:

"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>
FORMATO DE SALIDA REQUERIDO: [Tu contenido traducido aquí]

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 del post
	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 email 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 un struct Author con los valores leídos

	// TODO: Crear un struct Post con los valores leídos y el Author

	// TODO: Manejar el tipo de operación
	// Si la operación 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 nueva línea

	// Marcador de posición para usar las variables (eliminar 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