Menu
Coddy logo textTech

Повторение: модели REST API

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 78 из 107.

challenge icon

Задание

Легко

Давайте создадим систему моделей REST API для платформы блогов! Вы создадите хорошо структурированные типы, которые сериализуются в JSON и предоставляют читаемые строковые представления — именно то, что нужно при создании реальных ответов API.

Вы организуете свой код в двух файлах:

  • models.go: Определите модели данных API с соответствующими тегами JSON и строковыми представлениями.

    Создайте структуру Author с полями ID (int), Name (string) и Email (string). Сопоставьте их с ключами JSON "id", "name" и "email". Реализуйте метод String(), который возвращает формат [Name] <[Email]>.

    Создайте структуру Post с полями ID (int), Title (string), Content (string), Author (вложенная структура Author) и Published (bool). Сопоставьте их с "id", "title", "content", "author" и "published". Поле Content должно использовать omitempty, чтобы пустое содержимое не отображалось в JSON. Реализуйте метод String(), который возвращает "[Title]" by [Author's String representation].

    Создайте структуру APIResponse с полями Success (bool), Message (string) и Data (Post). Сопоставьте их с "success", "message" и "data". Поле Message должно использовать omitempty.

  • main.go: Создайте ответы API и продемонстрируйте как вывод JSON, так и строковые представления.

    Считайте тип операции (json или display), затем считайте детали поста: ID поста, заголовок, содержимое, ID автора, имя автора, email автора и статус публикации (true или false).

    Для json: Создайте APIResponse с Success: true и Post в качестве данных (оставьте Message пустым). Преобразуйте в JSON и выведите его.

    Для display: Создайте Post и выведите его, используя метод String, затем выведите Author отдельно на новой строке.

Будут предоставлены следующие входные данные:

  • Строка 1: Тип операции (json или display)
  • Строка 2: ID поста
  • Строка 3: Заголовок
  • Строка 4: Содержимое (может быть пустым)
  • Строка 5: ID автора
  • Строка 6: Имя автора
  • Строка 7: Email автора
  • Строка 8: Статус публикации (true или false)

Например, при вводе:

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

Ваш вывод должен быть:

{"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}}

И при вводе:

json
2
Draft Post

102
John Doe
john@example.com
false

Ваш вывод должен быть:

{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}

Обратите внимание, как пустое поле content опускается в выводе JSON.

И при вводе:

display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
true

Ваш вывод должен быть:

"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>

Попробуйте сами

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)

	// Считать тип операции
	operation, _ := reader.ReadString('\n')
	operation = strings.TrimSpace(operation)

	// Считать ID поста
	postIDStr, _ := reader.ReadString('\n')
	postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))

	// Считать заголовок
	title, _ := reader.ReadString('\n')
	title = strings.TrimSpace(title)

	// Считать содержимое
	content, _ := reader.ReadString('\n')
	content = strings.TrimSpace(content)

	// Считать ID автора
	authorIDStr, _ := reader.ReadString('\n')
	authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))

	// Считать имя автора
	authorName, _ := reader.ReadString('\n')
	authorName = strings.TrimSpace(authorName)

	// Считать email автора
	authorEmail, _ := reader.ReadString('\n')
	authorEmail = strings.TrimSpace(authorEmail)

	// Считать статус публикации
	publishedStr, _ := reader.ReadString('\n')
	published := strings.TrimSpace(publishedStr) == "true"

	// TODO: Создать структуру Author с прочитанными значениями

	// TODO: Создать структуру Post с прочитанными значениями и Author

	// TODO: Обработать тип операции
	// Если operation равно "json":
	//   - Создать APIResponse с Success: true и Post в качестве Data
	//   - Преобразовать в JSON, используя json.Marshal
	//   - Вывести JSON-строку
	// Если operation равно "display":
	//   - Вывести Post, используя его метод String
	//   - Вывести Author на новой строке

	// Заполнитель для использования переменных (удалить при реализации)
	_ = postID
	_ = title
	_ = content
	_ = authorID
	_ = authorName
	_ = authorEmail
	_ = published
	_ = operation
	_ = json.Marshal
	fmt.Println("TODO: Implement the solution")
}

Все уроки раздела Объектно-ориентированное программирование

11Стандартная библиотека и ООП

io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API