Ripasso - modelli REST API
Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 78 di 107.
Sfida
FacileCostruiamo 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
Authorcon i campiID(int),Name(string) eEmail(string). Mappali alle chiavi JSON"id","name"e"email". ImplementaString()in modo che restituisca il formato[Name] <[Email]>.Crea una struct
PostconID(int),Title(string),Content(string),Author(struct Author annidata) ePublished(bool). Mappali a"id","title","content","author"e"published". Il campoContentdeve usareomitempty, in modo che i contenuti vuoti non appaiano nel JSON. ImplementaString()in modo che restituisca"[Title]" by [Author's String representation].Crea una struct
APIResponseconSuccess(bool),Message(string) eData(Post). Mappali a"success","message"e"data". Il campoMessagedeve usareomitempty.main.go: Crea risposte API e mostra sia l'output JSON sia le rappresentazioni testuali.Leggi un tipo di operazione (
jsonodisplay), poi leggi i dettagli del post: ID del post, titolo, contenuto, ID dell'autore, nome dell'autore, email dell'autore e stato di pubblicazione (trueofalse).Per
json: Crea un APIResponse conSuccess: truee 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 (
jsonodisplay) - 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 (
trueofalse)
Per esempio, dato:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueIl 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
falseIl 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
trueIl 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
1Fondamenti di OOP in Go
File esterniWorkspace e moduli GoPacchetti e importazioniNomi esportati e non esportatiIntroduzione all’OOP in GoGli struct come classiDefinire metodi sugli structReceiver con puntatore vs receiver con valoreInizializzazione degli structFunzioni costruttriciRiepilogo - Calcolatrice semplice4Interfacce
Introduzione alle interfacceImplementazione implicitaL’interfaccia come contrattoInterfaccia vuota (any)Asserzione di tipoSwitch sul tipoComposizione di interfacceInterfacce Stringer ed ErrorRipasso - Calcolatore di forme7Incapsulamento
Campi esportati e non esportatiIncapsulamento a livello di packageMetodi Getter e SetterNascondimento delle informazioni in GoRiepilogo - Registri degli studenti10Tipi generici (Go 1.18+)
Introduzione ai tipi genericiParametri di tipoVincoli di tipoStruct genericheSoluzione alternativa per i metodi genericiRiepilogo - Collezione generica13Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello Abstract FactoryModello ObserverModello Strategy2Approfondimento su tipi e struct
Tipi di base e compostiDefinizioni di tipi personalizzatiTag delle structStruct anonimeStruct annidateValori zero e predefinitiRipasso - Rubrica5Composizione invece dell'ereditarietà
Perché Go non ha l'ereditarietàFondamenti dell'embedding delle structPromozione dei metodiEmbedding di più structEmbedding e aggregazione a confrontoMascheramento dei metodi embeddedRiepilogo: gerarchia dei dipendenti8Gestione degli errori e OOP
L'interfaccia errorTipi di errore personalizzatiWrapping degli errori (fmt.Errorf)Errori sentinellaerrors.Is() ed errors.As()Panic, Defer e RecoverRiepilogo - Parser di file11Libreria standard e OOP
io.Reader e io.Writersort.InterfaceInterfaccia fmt.Stringerencoding/json con le structInterfaccia http.HandlerRipasso - modelli REST API14Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeMiddleware come Decorator3Puntatori e memoria
Concetti base dei puntatori in GoPuntatori a structPassaggio per valore vs per riferimentoLa funzione new()Garbage collection in GoRiepilogo - Costruttore di liste concatenate6Polimorfismo in Go
Polimorfismo tramite interfacceDuck typing in GoRegole di soddisfacimento delle interfacceCollezioni polimorficheIniezione delle dipendenzeRiepilogo - Elaboratore di pagamenti9Concorrenza e OOP
Basi delle goroutineCanali e comunicazioneCanali bufferizzati vs non bufferizzatiIstruzione selectsync.Mutex e sync.RWMutexsync.WaitGroupProgettazione di struct thread-safeRiepilogo: worker poolEsercitati da solo: Compilatore Go online