Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
Наше приложение будет поддерживать основные CRUD-операции (создание, чтение, обновление, удаление) для заметок через RESTful API. В ходе разработки мы обсудим ключевые аспекты интеграции Gin и ORM-библиотеки GORM, а также продемонстрируем, как обеспечить безопасность и производительность нашего веб-приложения. Основные возможности нашего приложения включают:
-
* Пользователь сможет добавить новую заметку, отправив POST-запрос с заголовком и содержимым заметки.
* Приложение сохранит новую заметку в базе данных и вернет её уникальный идентификатор.-
Пользователь сможет добавить новую заметку, отправив POST-запрос с заголовком и содержимым заметки.
-
Приложение сохранит новую заметку в базе данных и вернет её уникальный идентификатор.
-
* Пользователь сможет запросить список всех заметок, отправив GET-запрос.
* Приложение вернет все заметки из базы данных в формате JSON.-
Пользователь сможет запросить список всех заметок, отправив GET-запрос.
-
Приложение вернет все заметки из базы данных в формате JSON.
-
* Пользователь сможет получить конкретную заметку по её идентификатору, отправив GET-запрос с указанным ID.
* Приложение найдет заметку в базе данных и вернет её в формате JSON.- Пользователь сможет получить конкретную заметку по её идентификатору, отправив GET-запрос с указанным ID.
- Приложение найдет заметку в базе данных и вернет её в формате JSON.
- Обновление существующей заметки:
Обновление существующей заметки:
-
* Пользователь сможет обновить существующую заметку, отправив PUT-запрос с новым заголовком и содержимым заметки.
* Приложение обновит данные заметки в базе данных и вернет обновленную заметку.-
Пользователь сможет обновить существующую заметку, отправив PUT-запрос с новым заголовком и содержимым заметки.
-
Приложение обновит данные заметки в базе данных и вернет обновленную заметку.
-
* Пользователь сможет удалить заметку по её идентификатору, отправив DELETE-запрос с указанным ID.
* Приложение удалит заметку из базы данных и вернет статус успешного выполнения операции.- Пользователь сможет удалить заметку по её идентификатору, отправив DELETE-запрос с указанным ID.
- Приложение удалит заметку из базы данных и вернет статус успешного выполнения операции.
Подразумевается, что у вас установлен Go версии 1.22 (установить его можно, например, по одной из этих инструкций Windows, Ubuntu, MacOS). При использовании более ранних версий, в процессе запуска проекта могут возникнуть ошибки. Также у вас есть базовое представление о Git и аккаунт на одном из сервисов хостинга Git репозиториев (GitHub, GitLab, Bitbucket, Gitea и т.п.).
- Создадим директорию проекта командой:
Создадим директорию проекта командой:
И перейдем в нее, выполнив:
- Инициируем новый модуль Go командой:
Инициируем новый модуль Go командой:
go mod init gin-notes-api- Установим необходимые для проекта пакеты: Gin, GORM и SQLite для работы с базой данных, командами:
Установим необходимые для проекта пакеты: Gin, GORM и SQLite для работы с базой данных, командами:
go get -u github.com/gin-gonic/gin
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite- Создадим структуру проекта. Она должна выглядеть вот так:
Создадим структуру проекта. Она должна выглядеть вот так:
GinTW/
├── go.mod
├── main.go
├── models/
│ └── note.go
├── handlers/
│ └── note_handlers.go
├── storage/
│ └── storage.go
│ └── database.goСоздать структуру вы можете средствами IDE или выполнив следующую команду в терминале:
mkdir -p models handlers storage && touch go.mod main.go models/note.go handlers/note_handlers.go storage/storage.go storage/database.goОпределяет структуру данных для заметок. Модель Note описывает поля заметки и используется для работы с базой данных через ORM-библиотеку GORM.
package models
// Определение структуры заметки
type Note struct {
ID int `json:"id" gorm:"primaryKey;autoIncrement"` // Уникальный идентификатор заметки, автоматически инкрементируемый
Title string `json:"title"` // Заголовок заметки
Content string `json:"content"` // Содержание заметки
}Этот файл содержит функции для инициализации базы данных и получения экземпляра базы данных. Здесь используется ORM-библиотека GORM для работы с базой данных SQLite.
package storage
import (
// Импортирование необходимых пакетов
"gorm.io/driver/sqlite" // Драйвер для работы с SQLite
"gorm.io/gorm" // Основная библиотека GORM для работы с ORM
"gin-notes-api/models" // Импортирование пакета с определением моделей данных
)
// Объявление глобальной переменной для хранения экземпляра базы данных
var db *gorm.DB
// Функция инициализации базы данных
func InitDatabase() error {
var err error
// Открытие подключения к базе данных SQLite с использованием GORM
db, err = gorm.Open(sqlite.Open("notes.db"), &gorm.Config{})
if err != nil {
// Возвращение ошибки, если подключение не удалось
return err
}
// Автоматическое создание таблицы для модели Note, если она еще не существует
return db.AutoMigrate(&models.Note{})
}
// Функция для получения экземпляра базы данных
func GetDB() *gorm.DB {
// Возвращение глобальной переменной db, содержащей подключение к базе данных
return db
}Этот код обеспечивает выполнение основных операций CRUD (создание, чтение, обновление, удаление) для модели Note, используя GORM для взаимодействия с базой данных SQLite.
package storage
import (
"gin-notes-api/models" // Импортирование пакета с определением моделей данных
)
// Функция для получения всех заметок из базы данных
func GetAllNotes() []models.Note {
var notes []models.Note
// Использование GORM для выполнения SQL-запроса SELECT и заполнения среза notes
db.Find(¬es)
return notes // Возвращение всех найденных заметок
}
// Функция для получения заметки по ID
func GetNoteByID(id int) *models.Note {
var note models.Note
// Использование GORM для выполнения SQL-запроса SELECT с условием WHERE id = id заметки
if result := db.First(¬e, id); result.Error != nil {
return nil // Возвращение nil, если заметка с указанным ID не найдена
}
return ¬e // Возвращение найденной заметки
}
// Функция для создания новой заметки
func CreateNote(title, content string) models.Note {
note := models.Note{
Title: title,
Content: content,
}
// Использование GORM для выполнения SQL-запроса INSERT и сохранения новой заметки в базе данных
db.Create(¬e)
return note // Возвращение созданной заметки
}
// Функция для обновления существующей заметки по ID
func UpdateNote(id int, title, content string) *models.Note {
var note models.Note
// Использование GORM для выполнения SQL-запроса SELECT с условием WHERE id = id заметки
if result := db.First(¬e, id); result.Error != nil {
return nil // Возвращение nil, если заметка с указанным ID не найдена
}
note.Title = title
note.Content = content
// Использование GORM для выполнения SQL-запроса UPDATE и сохранения обновленной заметки в базе данных
db.Save(¬e)
return ¬e // Возвращение обновленной заметки
}
// Функция для удаления заметки по ID
func DeleteNoteByID(id int) bool {
// Использование GORM для выполнения SQL-запроса DELETE с условием WHERE id = id заметки
if result := db.Delete(&models.Note{}, id); result.Error != nil {
return false // Возвращение false, если удаление не удалось
}
return true // Возвращение true при успешном удалении заметки
}handlers/note_handlers.go
Этот файл содержит функции-обработчики (хендлеры) для обработки HTTP-запросов. Эти функции вызываются в ответ на различные маршруты и выполняют действия, такие как создание, получение, обновление и удаление заметок.
Этот файл является основной точкой входа в приложение. В нем происходит инициализация базы данных и настройка маршрутов для обработки HTTP-запросов с использованием веб-фреймворка Gin.
package main
import (
"log" // Пакет для логирования
"github.com/gin-gonic/gin" // Веб-фреймворк Gin
"gin-notes-api/handlers" // Импортирование модуля с обработчиками запросов
"gin-notes-api/storage" // Импортирование модуля для работы с базой данных
)
func main() {
// Инициализация базы данных
if err := storage.InitDatabase(); err != nil {
log.Fatalf("Failed to initialize database: %v", err) // Логирование ошибки и завершение программы, если инициализация базы данных не удалась
}
// Создание нового роутера Gin с настройками по умолчанию
router := gin.Default()
// Определение маршрутов и привязка их к соответствующим обработчикам
router.GET("/notes", handlers.GetNotes) // Маршрут для получения всех заметок
router.GET("/notes/:id", handlers.GetNoteByID) // Маршрут для получения заметки по ID
router.POST("/notes", handlers.CreateNote) // Маршрут для создания новой заметки
router.PUT("/notes/:id", handlers.UpdateNoteByID) // Маршрут для обновления заметки по ID
router.DELETE("/notes/:id", handlers.DeleteNoteByID) // Маршрут для удаления заметки по ID
// Запуск веб-сервера на порту 8080
router.Run(":8080")
}Теперь мы можем запустить приложение локально и протестировать его функциональность.
Для запуска используем команду:
Примеры curl-запросов для тестирования функционала
curl -X POST http://localhost:8080/notes -H "Content-Type: application/json" -d '{"title":"Заголовок","content":"Тело заметки"}'
curl -X GET http://localhost:8080/notes
curl -X GET http://localhost:8080/notes/1
curl -X PUT http://localhost:8080/notes/1 -H "Content-Type: application/json" -d '{"title":"Обновленный заголовок","content":"Обновленное тело заметки"}'
curl -X DELETE http://localhost:8080/notes/1Деплой приложения в Simple-Server App Platform
Для развертывания приложения с помощью App Platform, необходимо разместить проект в git-репозитории. В данном примере используется GitHub.
Создание и загрузка репозитория
Создайте новый репозиторий на GitHub и инициализируйте его локально в директории вашего проекта:
git init -b main
git add .
git commit -m 'First commit'Теперь можем загрузить репозиторий на удаленный сервер, воспользовавшись командами, которые указаны при создании нового репозитория github:
git remote add origin git@github.com:ваш_пользователь/ваш_репозиторий.git
git push -u origin mainНастройка Simple-Server App Platform
-
Перейдите в раздел App Platform и нажмите «Создать».
-
В разделе «Тип» выберите вкладку «Backend» и найдите фреймворк Gin.
-
Подключите ваш GitHub-аккаунт, предоставив доступ к репозиториям, или выберите необходимый репозиторий вручную.
Перейдите в раздел App Platform и нажмите «Создать».
В разделе «Тип» выберите вкладку «Backend» и найдите фреймворк Gin.
Подключите ваш GitHub-аккаунт, предоставив доступ к репозиториям, или выберите необходимый репозиторий вручную.
- После подключения Github-аккаунта, разделе «Репозиторий» выберите ваш репозиторий с приложением.
После подключения Github-аккаунта, разделе «Репозиторий» выберите ваш репозиторий с приложением.
-
Выберите регион, в котором будет размещено приложение.
-
В разделе «Конфигурация» выберите минимальные настройки, их будет достаточно для текущего проекта. При необходимости, конфигурацию можно будет изменить позже.
-
В разделе «Настройки приложения» оставьте значения по умолчанию. В более сложных проектах можно указать переменные окружения и команду для сборки приложения.
-
Укажите имя будущего приложения и нажмите «Запустить деплой».
Выберите регион, в котором будет размещено приложение.
В разделе «Конфигурация» выберите минимальные настройки, их будет достаточно для текущего проекта. При необходимости, конфигурацию можно будет изменить позже.
В разделе «Настройки приложения» оставьте значения по умолчанию. В более сложных проектах можно указать переменные окружения и команду для сборки приложения.
Укажите имя будущего приложения и нажмите «Запустить деплой».
Процесс деплоя может занять до 10 минут. После завершения вы увидите сообщение «Deployment successfully completed» в логах деплоя.
Перейдите в раздел «Настройки» на странице приложения, где будет указан домен, привязанный к вашему приложению.
В этом же разделе можно изменить конфигурацию сервера, отредактировать настройки деплоя и изменить привязку домена. При подключении своего домена, для него автоматически будет установлен сертификат Let’s Encrypt, который будет автоматически продлеваться за 7 дней до истечения срока.
Для проверки, что приложение работает корректно, можем выполнить curl-запрос, изменив localhost на привязанный домен:
curl -X GET https://ваш_домен/notesМы разработали базовое веб-приложение для управления заметками с использованием фреймворка Gin и библиотеки GORM. Созданный RESTful API поддерживает основные CRUD-операции, что делает приложение простым и удобным в использовании.
Gin показал себя как эффективный и простой в освоении инструмент. Его система маршрутизации и поддержка одновременных запросов упростили процесс разработки. GORM помог легко работать с базой данных, автоматизировав многие задачи.
Приложение успешно развернуто на платформе Simple-Server App Platform, что сделало процесс деплоя быстрым и надежным. App Platform предоставляет все необходимые инструменты для комфортного управления приложением.
В будущем можно добавить новые функции, такие как аутентификация пользователей и улучшенные возможности поиска заметок.
Этот проект продемонстрировал, как современные инструменты разработки, такие как Gin и GORM, могут упростить создание веб-приложений.
Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.