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¡Vamos a construir un sistema de modelos de API REST para una plataforma de blogs! Crearás tipos bien estructurados que se serializan a JSON y proporcionan representaciones de cadena legibles, exactamente lo que necesitarías al construir respuestas de API reales.
Organizarás tu código en dos archivos:
models.go: Define tus modelos de datos de API con las etiquetas JSON adecuadas y representaciones de cadena.Crea una estructura
Authorcon los camposID(int),Name(string) yEmail(string). Mapea estos a las claves JSON"id","name"y"email". ImplementaString()para devolver el formato[Name] <[Email]>.Crea una estructura
PostconID(int),Title(string),Content(string),Author(estructura Author anidada) yPublished(bool). Mapea estos a"id","title","content","author"y"published". El campoContentdebe usaromitemptypara que el contenido vacío no aparezca en el JSON. ImplementaString()para devolver"[Title]" by [Author's String representation].Crea una estructura
APIResponseconSuccess(bool),Message(string) yData(Post). Mapea a"success","message"y"data". El campoMessagedebe usaromitempty.main.go: Construye respuestas de API y demuestra tanto la salida JSON como las representaciones de cadena.Lee un tipo de operación (
jsonodisplay), luego 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 el Post como datos (deja Message vacío). Conviértelo a JSON e imprímelo.Para
display: Crea el Post e imprímelo usando su método String, luego 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, dado:
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 dado:
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 dado:
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 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 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 operation es "json":
// - Crear un APIResponse con Success: true y el Post como Data
// - Convertir a JSON usando json.Marshal
// - Imprimir la cadena JSON
// Si operation es "display":
// - Imprimir el Post usando su método String
// - Imprimir el Author en una nueva línea
// Marcador de posición para usar 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 Pool