Как создать REST API на Go (Golang): подробный гайд
REST API — это способ взаимодействия приложений через HTTP-запросы. Сегодня мы рассмотрим, как быстро и понятно реализовать простой REST API на Go, используя популярный фреймворк Gin.
🐹 Почему Go отлично подходит для REST API?
- Быстрая производительность: Go — компилируемый язык, что даёт высокую скорость работы API.
- Простота и понятность кода: минималистичный и ясный синтаксис.
- Встроенные инструменты для веб-разработки: простота работы с HTTP-запросами и ответами.
- Легко поддерживать и масштабировать: отлично подходит для микросервисов и крупных API.
📦 Устанавливаем Go и Gin
go version
Подробнее по установке можно найти тут: Golang для новичков: основные понятия и примеры кода
mkdir rest-api cd rest-api go mod init rest-api
Установи Gin — веб-фреймворк для Go:
go get github.com/gin-gonic/gin
🧑💻 Создаём первое REST API приложение
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Привет, REST API!"}) }) r.Run(":8080") // запуск сервера на порту 8080 }
Давай разберём по частям, что здесь происходит:
package main
Объявляем пакет приложения (main
). Go запускает приложение именно из функцииmain
внутри пакетаmain
.import "github.com/gin-gonic/gin"
Подключаем фреймворк Gin, который позволяет легко создавать веб-приложения.func main()
Это точка входа. С неё Go начинает выполнять программу.r := gin.Default()
Создаём объект Gin с дефолтными настройками. Он предоставляет маршрутизацию, обработку middleware, логирование и восстановление после ошибок.r.GET("/hello", func(c *gin.Context)
Мы объявляем HTTP GET-маршрут по адресу/hello
.
Если сервер получит GET-запрос по этому адресу, то выполнит код внутри этой функции.c.JSON(200, gin.H{"message": "Привет, REST API!"})
Возвращаем клиенту HTTP-ответ в формате JSON с кодом 200 (OK).gin.H
— это сокращённая форма записиmap[string]interface{}
, позволяющая легко создавать JSON-ответы.r.Run(":8080")
Запускаем HTTP-сервер на порту8080
. Теперь приложение слушает и обрабатывает запросы, приходящие на этот порт.
Таким образом, всего в несколько строчек кода ты получил работающий REST API, готовый принимать и обрабатывать HTTP-запросы! 🎉
go run main.go
Теперь открой браузер или выполни запрос через curl:
curl http://localhost:8080/hello
{"message":"Привет, REST API!"}
⚙️ CRUD операции через REST API
Создадим простое CRUD API для сущности "Задачи" (tasks
). Для этого добавим структуру данных и endpoints.
package main import ( "net/http" "github.com/gin-gonic/gin" ) // Структура задачи type Task struct { ID string `json:"id"` Title string `json:"title"` Status string `json:"status"` } // Имитация БД var tasks = []Task{ {ID: "1", Title: "Написать код", Status: "todo"}, {ID: "2", Title: "Выпить кофе", Status: "done"}, } func main() { r := gin.Default() // Получение всех задач r.GET("/tasks", func(c *gin.Context) { c.JSON(http.StatusOK, tasks) }) // Получение задачи по ID r.GET("/tasks/:id", func(c *gin.Context) { id := c.Param("id") for _, t := range tasks { if t.ID == id { c.JSON(http.StatusOK, t) return } } c.JSON(http.StatusNotFound, gin.H{"message": "задача не найдена"}) }) // Создание задачи r.POST("/tasks", func(c *gin.Context) { var newTask Task if err := c.BindJSON(&newTask); err != nil { c.JSON(http.StatusBadRequest, gin.H{"message": "неверные данные"}) return } tasks = append(tasks, newTask) c.JSON(http.StatusCreated, newTask) }) // Удаление задачи по ID r.DELETE("/tasks/:id", func(c *gin.Context) { id := c.Param("id") for i, t := range tasks { if t.ID == id { tasks = append(tasks[:i], tasks[i+1:]...) c.JSON(http.StatusOK, gin.H{"message": "задача удалена"}) return } } c.JSON(http.StatusNotFound, gin.H{"message": "задача не найдена"}) }) r.Run(":8080") }
🔥 Примеры использования API (через curl)
После того как ты запустил своё API, важно протестировать его работу. Самый простой и универсальный способ проверить REST API — использовать команду curl
. Это консольная утилита, с помощью которой ты можешь отправлять HTTP-запросы к своему серверу и видеть ответы прямо в терминале.
Ниже представлены простые примеры, которые помогут тебе понять, как взаимодействовать с API, получать данные, добавлять новые элементы или удалять существующие. Каждый из запросов демонстрирует одну из основных операций REST API: GET, POST и DELETE.
curl http://localhost:8080/tasks
curl http://localhost:8080/tasks/1
curl -X POST http://localhost:8080/tasks \ -H "Content-Type: application/json" \ -d '{"id":"3", "title":"Выучить Go", "status":"in progress"}'
curl -X DELETE http://localhost:8080/tasks/2
📖 Добавляем автоматичесую документацию через OpenAPI и Swagger
OpenAPI (раньше назывался Swagger) — это стандарт для описания REST API.
Он позволяет задокументировать, какие есть endpoints у твоего API, какие запросы они принимают и какие ответы отправляют. Это нужно для:
- удобного взаимодействия с твоим API (для фронтенда и других команд),
- автоматической генерации документации и клиентского кода,
- тестирования и изучения API.
Swagger — это инструменты и UI для удобного просмотра и взаимодействия с OpenAPI-документацией прямо в браузере.
🔧 Добавляем OpenAPI/Swagger в REST API на Go (с Gin)
Самый популярный способ сделать это — использовать библиотеку swaggo/gin-swagger
.
🚀 Шаг 1: Устанавливаем инструменты
Сначала поставим необходимые пакеты:
go install github.com/swaggo/swag/cmd/swag@latest go get github.com/swaggo/gin-swagger go get github.com/swaggo/files
🚀 Шаг 2: Документируем наш API с помощью комментариев
Добавь комментарии в файл main.go
:
package main import ( "github.com/gin-gonic/gin" "github.com/swaggo/gin-swagger" swaggerFiles "github.com/swaggo/files" _ "rest-api/docs" ) // @title Пример REST API // @version 1.0 // @description Это простой пример REST API на Go с Gin и Swagger // @host localhost:8080 // @BasePath / func main() { r := gin.Default() // @Summary Скажи Привет // @Description Возвращает приветственное сообщение // @Tags пример // @Produce json // @Success 200 {object} map[string]string // @Router /hello [get] r.GET("/hello", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Привет, REST API!"}) }) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) r.Run(":8080") }
🚀 Шаг 3: Генерируем документацию (OpenAPI schema)
В корне проекта выполни команду:
swag init
Эта команда создаст папку docs
с файлом swagger.json
.
🌐 Проверяем Swagger UI
go run main.go
Открой браузер и перейди по ссылке:
http://localhost:8080/swagger/index.html
Теперь ты видишь удобную и красивую документацию, где можно протестировать API прямо из браузера.
🔍 Что именно мы сделали?
- Добавили специальные комментарии в код, которые понимает инструмент
swag
. - Используя эти комментарии, инструмент автоматически создал OpenAPI спецификацию в формате JSON.
- Gin-swagger предоставляет красивый UI (Swagger UI), чтобы изучать и тестировать API интерактивно.
🐾 Кошачий пример про OpenAPI:
Swagger UI — это как меню в кафе с картинками блюд. Ты точно знаешь, что можно заказать (API endpoints), какие ингредиенты нужны (параметры запросов), и что получишь в итоге (ответы API).
🚧 Что ещё можно улучшить?
- ✅ Подключить настоящую базу данных (например, PostgreSQL, MongoDB).
- ✅ Добавить валидацию данных.
- ✅ Настроить логирование и мониторинг.
- ✅ Защитить API авторизацией (JWT или OAuth).
🐾 Кошачий пример REST API
Представь, что твоё REST API — это котик-официант:
- GET — спросить меню (прочитать данные),
- POST — сделать заказ (создать данные),
- PUT/PATCH — изменить заказ (обновить данные),
- DELETE — отменить заказ (удалить данные).
✅ Итог
Ты создал простое REST API на Go за несколько минут, использовав удобный и быстрый фреймворк Gin. Go отлично подходит для создания эффективных, масштабируемых и легко поддерживаемых веб-приложений.
Теперь ты можешь дальше улучшать API, подключать базы данных и внедрять в свои проекты! 🐹✨🚀