Recapitulação - Modelos de API REST
Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy — lição 78 de 107.
Desafio
FácilVamos construir um sistema de modelos de API REST para uma plataforma de blog! Você criará tipos bem estruturados que serializam para JSON e fornecem representações de string legíveis — exatamente o que você precisaria ao construir respostas de API reais.
Você organizará seu código em dois arquivos:
models.go: Defina seus modelos de dados de API com as tags JSON adequadas e representações de string.Crie uma struct
Authorcom os camposID(int),Name(string) eEmail(string). Mapeie-os para as chaves JSON"id","name"e"email". ImplementeString()para retornar o formato[Name] <[Email]>.Crie uma struct
PostcomID(int),Title(string),Content(string),Author(struct Author aninhada) ePublished(bool). Mapeie-os para"id","title","content","author"e"published". O campoContentdeve usaromitemptypara que o conteúdo vazio não apareça no JSON. ImplementeString()para retornar"[Title]" by [Author's String representation].Crie uma struct
APIResponsecomSuccess(bool),Message(string) eData(Post). Mapeie para"success","message"e"data". O campoMessagedeve usaromitempty.main.go: Construa respostas de API e demonstre tanto a saída JSON quanto as representações de string.Leia um tipo de operação (
jsonoudisplay), depois leia os detalhes do post: ID do post, título, conteúdo, ID do autor, nome do autor, e-mail do autor e status de publicação (trueoufalse).Para
json: Crie um APIResponse comSuccess: truee o Post como dados (deixe Message vazio). Converta para JSON e imprima-o.Para
display: Crie o Post e imprima-o usando seu método String, depois imprima o Author separadamente em uma nova linha.
As seguintes entradas serão fornecidas:
- Linha 1: Tipo de operação (
jsonoudisplay) - Linha 2: ID do Post
- Linha 3: Título
- Linha 4: Conteúdo (pode estar vazio)
- Linha 5: ID do Autor
- Linha 6: Nome do autor
- Linha 7: E-mail do autor
- Linha 8: Status de publicação (
trueoufalse)
Por exemplo, dado:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueSua saída deve 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}}E dado:
json
2
Draft Post
102
John Doe
john@example.com
falseSua saída deve ser:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Observe como o campo de conteúdo vazio é omitido da saída JSON.
E dado:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueSua saída deve ser:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>Experimente você mesmo
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Ler o tipo de operação
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Ler o ID do post
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Ler o título
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// Ler o conteúdo
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Ler o ID do autor
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Ler o nome do autor
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// Ler o e-mail do autor
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Ler o status de publicação
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Criar uma struct Author com os valores lidos
// TODO: Criar uma struct Post com os valores lidos e o Author
// TODO: Lidar com o tipo de operação
// Se operation for "json":
// - Criar um APIResponse com Success: true e o Post como Data
// - Converter para JSON usando json.Marshal
// - Imprimir a string JSON
// Se operation for "display":
// - Imprimir o Post usando seu método String
// - Imprimir o Author em uma nova linha
// Espaço reservado para usar variáveis (remover ao implementar)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP em Go
Arquivos ExternosGo Workspace e MódulosPacotes e ImportaçõesNomes Exportados vs Não ExportadosIntrodução a OOP em GoStructs como ClassesDefinindo Métodos em StructsRecebedores de Ponteiro vs ValorInicialização de StructsFunções ConstrutorasRecapitulação - Calculadora Simples4Interfaces
Introdução a InterfacesImplementação ImplícitaInterface como ContratoInterface Vazia (any)Type AssertionType SwitchComposição de InterfacesInterfaces Stringer & ErrorRecapitulação - Calculadora de Formas7Encapsulamento
Campos Exportados vs Não ExportadosEncapsulamento em Nível de PacoteMétodos Getter e SetterOcultação de Informação em GoRecapitulação - Registros de Estudantes10Generics (Go 1.18+)
Introdução a GenericsParâmetros de TipoRestrições de TipoStructs GenéricasSolução Alternativa para Métodos GenéricosRecapitulação - Coleção Genérica2Mergulho Profundo em Tipos e Structs
Tipos Básicos e CompostosDefinições de Tipos PersonalizadosStruct TagsStructs AnônimasStructs AninhadasZero Values e PadrõesRecapitulação - Agenda de Contatos5Composição em vez de Herança
Por que Go não possui HerançaFundamentos de Incorporação de StructsPromoção de MétodosIncorporando Múltiplas StructsIncorporação vs AgregaçãoShadowing de Métodos IncorporadosRecapitulação - Hierarquia de Funcionários8Tratamento de Erros e OOP
A Interface errorTipos de Erro PersonalizadosError Wrapping (fmt.Errorf)Erros Sentinelaerrors.Is() e errors.As()Panic, Defer e RecoverRecapitulação - File Parser11Biblioteca Padrão & POO
io.Reader & io.Writersort.InterfaceInterface fmt.Stringerencoding/json com StructsInterface http.HandlerRecapitulação - Modelos de API REST3Ponteiros e Memória
Fundamentos de Ponteiros em GoPonteiros para StructsPassagem por Valor vs ReferênciaA Função new()Garbage Collection em GoRecapitulação - Construtor de Lista Encadeada6Polimorfismo em Go
Polimorfismo via InterfacesDuck Typing em GoRegras de Satisfação de InterfaceColeções PolimórficasInjeção de DependênciaRecapitulação - Processador de Pagamentos9Concorrência e OOP
Fundamentos de GoroutinesCanais e ComunicaçãoCanais com Buffer vs. Sem BufferInstrução Selectsync.Mutex e sync.RWMutexsync.WaitGroupDesign de Structs Thread-SafeRecapitulação - Worker Pool