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.
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
Authorcon camposID(int),Name(string) yEmail(string). Asígnalos a las claves JSON"id","name"y"email". ImplementaString()para que devuelva el formato[Name] <[Email]>.Crea una estructura
Postcon los camposID(int),Title(string),Content(string),Author(estructura Author anidada) yPublished(bool). Asígnalos a"id","title","content","author"y"published". El campoContentdebe usaromitemptypara que el contenido vacío no aparezca en JSON. ImplementaString()para que devuelva"[Title]" by [Author's String representation].Crea una estructura
APIResponsecon los camposSuccess(bool),Message(string) yData(Post). Asígnalos a"success","message"y"data". El campoMessagedebe usaromitempty.main.go: Crea respuestas de API y muestra tanto la salida JSON como las representaciones de cadena.Lee un tipo de operación (
jsonodisplay) 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 (trueofalse).Para
json: crea un APIResponse conSuccess: truey 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 (
jsonodisplay) - 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 (
trueofalse)
Por ejemplo, dadas estas entradas:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueTu 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
falseTu 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
trueTu 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 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
1Fundamentos de POO en Go
Archivos externosEspacio de trabajo y módulos de GoPaquetes e importacionesNombres exportados vs. no exportadosIntroducción a la POO en GoStructs como clasesDefinición de métodos en structsReceptores de puntero vs. de valorInicialización de structsFunciones constructorasResumen - Calculadora simple4Interfaces
Introducción a las interfacesImplementación implícitaLa interfaz como contratoInterfaz vacía (any)Type AssertionType SwitchComposición de interfacesInterfaces Stringer y ErrorResumen: Calculadora de figuras7Encapsulamiento
Campos exportados vs. no exportadosEncapsulamiento a nivel de paqueteMétodos Getter y SetterOcultamiento de información en GoResumen - Registros de estudiantes10Genéricos (Go 1.18+)
Introducción a los GenéricosParámetros de tipoRestricciones de tipoStructs genéricosSolución alternativa para métodos genéricosResumen - Colección genérica13Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón Abstract FactoryPatrón ObserverPatrón Strategy2Inmersión profunda en Tipos y Structs
Tipos básicos y compuestosDefiniciones de tipos personalizadosEtiquetas de StructsStructs anónimosStructs anidadosValores cero y por defectoRepaso - Libreta de contactos5Composición sobre herencia
Por qué Go no tiene herenciaConceptos básicos de incrustación de structsPromoción de métodosIncrustación de múltiples structsIncrustación vs AgregaciónShadowing de métodos incrustadosResumen - Jerarquía de empleados8Manejo de Errores y OOP
La interfaz errorTipos de errores personalizadosEnvoltura de errores (fmt.Errorf)Errores centinelaerrors.Is() y errors.As()Panic, Defer y RecoverResumen - Analizador de archivos11Biblioteca estándar y POO
io.Reader e io.WriterInterfaz sort.InterfaceInterfaz fmt.Stringerencoding/json con StructsInterfaz http.HandlerRepaso - Modelos de REST API3Punteros y Memoria
Fundamentos de punteros en GoPunteros a StructsPaso por valor vs referenciaLa función new()Garbage Collection en GoResumen - Constructor de Linked List6Polimorfismo en Go
Polimorfismo mediante interfacesDuck Typing en GoReglas de satisfacción de interfacesColecciones polimórficasInyección de dependenciasResumen - Procesador de pagos9Concurrencia y POO
Fundamentos de GoroutinesChannels y comunicaciónChannels con buffer vs. sin bufferSentencia Selectsync.Mutex y sync.RWMutexsync.WaitGroupDiseño de estructuras Thread-SafeResumen - Worker PoolPractica por tu cuenta: Compilador de Go online