Как создать 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, подключать базы данных и внедрять в свои проекты! 🐹✨🚀