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

Потренируйтесь самостоятельно: Онлайн-компилятор Go