Menu
CoddyTech

Повторение: модели 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), затем считайте сведения о записи: идентификатор записи, заголовок, содержимое, идентификатор автора, имя автора, адрес электронной почты автора и статус публикации (true или false).

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

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

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

  • Строка 1: Тип операции (json или display)
  • Строка 2: Идентификатор записи
  • Строка 3: Заголовок
  • Строка 4: Содержимое (может быть пустым)
  • Строка 5: Идентификатор автора
  • Строка 6: Имя автора
  • Строка 7: Адрес электронной почты автора
  • Строка 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}}

Обратите внимание: пустое поле содержимого не включается в вывод 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)

	// Считать электронную почту автора
	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