Menu
Coddy logo textTech

Revisã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 criar um sistema de modelos de API REST para uma plataforma de blog! Você criará tipos bem estruturados que são serializados para JSON e fornecem representações de string legíveis, exatamente o que você precisaria ao criar respostas de API reais.

Você organizará seu código em dois arquivos:

  • models.go: Defina seus modelos de dados da API com tags JSON apropriadas 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 os campos 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 conteúdo vazio não apareça no JSON. Implemente String() para retornar "[Title]" by [Author's String representation].

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

  • main.go: Crie 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) e, em seguida, 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 uma APIResponse com Success: true e o Post como dados (deixe Message vazio). Converta para JSON e imprima.

    Para display: Crie o Post e imprima-o usando seu método String; em seguida, 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, dada a entrada:

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 dada a entrada:

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 dada a entrada:

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: Crie uma struct Author com os valores lidos

	// TODO: Crie uma struct Post com os valores lidos e o Author

	// TODO: Trate o tipo de operação
	// Se a operação for "json":
	//   - Crie um APIResponse com Success: true e o Post como Data
	//   - Converta para JSON usando json.Marshal
	//   - Imprima a string JSON
	// Se operation for "display":
	//   - Imprima o Post usando seu método String
	//   - Imprima o Author em uma nova linha

	// Placeholder para usar as 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

Pratique por conta própria: Compilador de Go online