Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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 Author com os campos ID (int), Name (string) e Email (string). Mapeie-os para as chaves JSON "id", "name" e "email". Implemente String() para retornar o formato [Name] <[Email]>.

    Crie uma struct Post com ID (int), Title (string), Content (string), Author (struct Author aninhada) e Published (bool). Mapeie-os para "id", "title", "content", "author" e "published". O campo Content deve usar omitempty para que o conteúdo vazio não apareça no JSON. Implemente String() para retornar "[Title]" by [Author's String representation].

    Crie uma struct APIResponse com Success (bool), Message (string) e Data (Post). Mapeie para "success", "message" e "data". O campo Message deve usar omitempty.

  • 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 (json ou display), 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 (true ou false).

    Para json: Crie um APIResponse com Success: true e 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 (json ou display)
  • 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 (true ou false)

Por exemplo, dado:

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

Sua 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
false

Sua 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
true

Sua 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